"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", "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", "os.hedmark", "os.hordaland", "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", "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"))); topMap.put( "nr", new HashSet<String>(Arrays.asList("biz", "info", "gov", "edu", "org", "net", "com", "co"))); topMap.put( "pa", new HashSet<String>(Arrays.asList("ac", "gob", "com", "org", "sld", "edu", "net", "ing", "abo", "med", "nom"))); topMap.put( "pe", new HashSet<String>(Arrays.asList("edu", "gob", "nom", "mil", "org", "com", "net", "sld"))); topMap.put( "pf", new HashSet<String>(Arrays.asList( "com"))); topMap.put( "ph", new HashSet<String>(Arrays.asList("com", "net", "org", "gov", "edu", "ngo", "mil"))); topMap.put( "pk", new HashSet<String>(Arrays.asList("com", "net", "edu", "org", "fam", "biz", "web", "gov", "gob", "gok", "gon", "gop", "gos", "gog", "gkp", "info"))); topMap.put( "pl", new HashSet<String>(Arrays.asList("aid", "agro", "atm", "auto", "biz", "com", "edu", "gmina", "gsm", "info", "mail", "miasta", "media", "mil", "net", "nieruchomosci", "nom", "org", "pc", "powiat", "priv", "realestate", "rel", "sex", "shop", "sklep", "sos", "szkola", "targi", "tm", "tourism", "travel", "turystyka", "art", "gov", "ngo", "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", "siedlce", "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", "gda", "gdansk", "krakow", "poznan", "wroc", "co", "lodz", "lublin", "torun"))); topMap.put( "pn", new HashSet<String>(Arrays.asList("gov", "co", "org", "edu", "net"))); topMap.put( "pr", new HashSet<String>(Arrays.asList("com", "net", "org", "gov", "edu", "isla", "pro", "biz", "info", "name", "est", "prof", "ac", "gobierno"))); topMap.put( "pro", new HashSet<String>(Arrays.asList("aca", "bar", "cpa", "jur", "law", "med", "eng"))); topMap.put( "ps", new HashSet<String>(Arrays.asList("edu", "gov", "sec", "plo", "com", "org", "net"))); topMap.put( "pt", new HashSet<String>(Arrays.asList("net", "gov", "org", "edu", "int", "publ", "com", "nome"))); topMap.put( "pw", new HashSet<String>(Arrays.asList("co", "ne", "or", "ed", "go", "belau"))); topMap.put( "qa", new HashSet<String>(Arrays.asList("com", "net", "org", "gov", "edu", "mil"))); topMap.put( "re", new HashSet<String>(Arrays.asList("com", "asso", "nom"))); topMap.put( "ro", new HashSet<String>(Arrays.asList("com", "org", "tm", "nt", "nom", "info", "rec", "arts", "firm", "store", "www"))); topMap.put( "rs", new HashSet<String>(Arrays.asList("co", "org", "edu", "ac", "gov", "in"))); topMap.put( "ru", new HashSet<String>(Arrays.asList("ac", "com", "edu", "int", "net", "org", "pp", "adygeya", "altai", "amur", "arkhangelsk", "astrakhan", "bashkiria", "belgorod", "bir", "bryansk", "buryatia", "cap", "cbg", "chel", "chelyabinsk", "chita", "chukotka", "dagestan", "e-burg", "grozny", "irkutsk", "ivanovo", "izhevsk", "jar", "joshkar-ola", "kalmykia", "kaluga", "kamchatka", "karelia", "kazan", "kchr", "kemerovo", "khabarovsk", "khakassia", "khv", "kirov", "koenig", "komi", "kostroma", "krasnoyarsk", "kuban", "kurgan", "kursk", "lipetsk", "magadan", "mari", "mari-el", "marine", "mordovia", "mosreg", "msk", "murmansk", "nalchik", "nnov", "nov", "novosibirsk", "nsk", "omsk", "orenburg", "oryol", "palana", "penza", "perm", "pskov", "ptz", "rnd", "ryazan", "sakhalin", "samara", "saratov", "simbirsk", "smolensk", "spb", "stavropol", "stv", "surgut", "tambov", "tatarstan", "tom", "tomsk", "tsaritsyn", "tsk", "tula", "tuva", "tver", "tyumen", "udm", "udmurtia", "ulan-ude", "vladikavkaz", "vladimir", "vladivostok", "volgograd", "vologda", "voronezh", "vrn", "vyatka", "yakutia", "yamal", "yaroslavl", "yekaterinburg", "yuzhno-sakhalinsk", "amursk", "baikal", "cmw", "fareast", "jamal", "kms", "k-uralsk", "kustanai", "kuzbass", "magnitka", "mytis", "nakhodka", "nkz", "norilsk", "oskol", "pyatigorsk", "rubtsovsk", "snz", "syzran", "vdonsk", "zgrad", "gov", "mil", "test"))); topMap.put( "rw", new HashSet<String>(Arrays.asList("gov", "net", "edu", "ac", "com", "co", "int", "mil", "gouv"))); topMap.put( "sa", new HashSet<String>(Arrays.asList("com", "net", "org", "gov", "med", "pub", "edu", "sch"))); topMap.put( "sd", new HashSet<String>(Arrays.asList("com", "net", "org", "edu", "med", "gov", "info", "tv"))); topMap.put( "se", new HashSet<String>(Arrays.asList("a", "ac", "b", "bd", "brand", "c", "d", "e", "f", "fh", "fhsk", "fhv", "g", "h", "i", "k", "komforb", "kommunalforbund", "komvux", "l", "lanarb", "lanbib", "m", "n", "naturbruksgymn", "o", "org", "p", "parti", "pp", "press", "r", "s", "sshn", "t", "tm", "u", "w", "x", "y", "z"))); topMap.put( "sg", new HashSet<String>(Arrays.asList("com", "net", "org", "gov", "edu", "per"))); topMap.put( "sh", new HashSet<String>(Arrays.asList("co", "com", "net", "org", "gov", "edu", "nom"))); topMap.put( "sk", new HashSet<String>(Arrays.asList("gov", "edu"))); topMap.put( "sn", new HashSet<String>(Arrays.asList("art", "com", "edu", "gouv", "org", "perso", "univ"))); topMap.put( "so", new HashSet<String>(Arrays.asList("com", "net", "org"))); topMap.put( "sr", new HashSet<String>(Arrays.asList("co", "com", "consulado", "edu", "embaixada", "gov", "mil", "net", "org", "principe", "saotome", "store"))); topMap.put( "sy", new HashSet<String>(Arrays.asList("edu", "gov", "net", "mil", "com", "org", "news"))); topMap.put( "sz", new HashSet<String>(Arrays.asList("co", "ac", "org"))); topMap.put( "th", new HashSet<String>(Arrays.asList("ac", "co", "go", "in", "mi", "net", "or"))); topMap.put( "tj", new HashSet<String>(Arrays.asList("ac", "biz", "co", "com", "edu", "go", "gov", "int", "mil", "name", "net", "nic", "org", "test", "web"))); topMap.put( "tn", new HashSet<String>(Arrays.asList("com", "ens", "fin", "gov", "ind", "intl", "nat", "net", "org", "info", "perso", "tourism", "edunet", "rnrt", "rns", "rnu", "mincom", "agrinet", "defense", "turen"))); topMap.put( "to", new HashSet<String>(Arrays.asList("gov"))); topMap.put( "tt", new HashSet<String>(Arrays.asList("co", "com", "org", "net", "biz", "info", "pro", "int", "coop", "jobs", "mobi", "travel", "museum", "aero", "name", "gov", "edu", "cat", "tel", "mil"))); topMap.put( "tw", new HashSet<String>(Arrays.asList("edu", "gov", "mil", "com", "net", "org", "idv", "game", "ebiz", "club", "xn--zf0ao64a", "xn--uc0atv", "xn--czrw28b"))); topMap.put( "ua", new HashSet<String>(Arrays.asList("com", "edu", "gov", "in", "net", "org", "cherkassy", "chernigov", "chernovtsy", "ck", "cn", "crimea", "cv", "dn", "dnepropetrovsk", "donetsk", "dp", "if", "ivano-frankivsk", "kh", "kharkov", "kherson", "kiev", "kirovograd", "km", "kr", "ks", "lg", "lugansk", "lutsk", "lviv", "mk", "nikolaev", "od", "odessa", "pl", "poltava", "rovno", "rv", "sebastopol", "sumy", "te", "ternopil", "uzhgorod", "vinnica", "vn", "zaporizhzhe", "zp", "zhitomir", "zt", "cr", "lt", "lv", "sb", "sm", "tr", "co", "biz", "in", "ne", "pp", "uz", "dominic"))); topMap.put( "ug", new HashSet<String>(Arrays.asList("co", "ac", "sc", "go", "ne", "or", "org", "com"))); topMap.put( "us", new HashSet<String>(Arrays.asList("dni", "fed", "isa", "kids", "nsn", "kyschools"))); topMap.put( "uz", new HashSet<String>(Arrays.asList("co", "com", "org", "gov", "ac", "edu", "int", "pp", "net"))); topMap.put( "vc", new HashSet<String>(Arrays.asList("com", "net", "org", "gov"))); topMap.put( "vi", new HashSet<String>(Arrays.asList("co", "com", "k12", "net", "org"))); topMap.put( "vn", new HashSet<String>(Arrays.asList( "com", "net", "org", "edu", "gov", "int", "ac", "biz", "info", "name", "pro", "health"))); topMap.put( "vu", new HashSet<String>(Arrays.asList("co", "com", "net", "org", "edu", "gov", "de"))); topMap.put("org", new HashSet<String>(Arrays.asList("ae", "za"))); topMap.put("pro", new HashSet<String>(Arrays.asList("aca", "bar", "cpa", "jur", "law", "med", "eng"))); top3Map.put("au", new HashSet<String>(Arrays.asList("act.edu.au", "eq.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", "nsw.gov.au", "nt.gov.au", "qld.gov.au", "sa.gov.au", "tas.gov.au", "vic.gov.au", "wa.gov.au"))); top3Map.put("im", new HashSet<String>(Arrays.asList("ltd.co.im", "plc.co.im"))); top3Map.put("no", new HashSet<String>(Arrays.asList("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", "bo.telemark.no", "xn--b-5ga.telemark.no", "bo.nordland.no", "xn--b-5ga.nordland.no", "heroy.more-og-romsdal.no", "xn--hery-ira.xn--mre-og-romsdal-qqb.no", "heroy.nordland.no", "xn--hery-ira.nordland.no", "nes.akershus.no", "nes.buskerud.no", "os.hedmark.no", "os.hordaland.no", "sande.more-og-romsdal.no", "sande.xn--mre-og-romsdal-qqb.no", "sande.vestfold.no", "valer.ostfold.no", "xn--vler-qoa.xn--stfold-9xa.no", "valer.hedmark.no", "xn--vler-qoa.hedmark.no"))); top3Map.put("tr", new HashSet<String>(Arrays.asList("gov.nc.tr")));} /* * Return the registered part of a qualified domain * name or the original if no match is found. */ public static String getRegisteredDomain(String cname) { int dot; /* * If one dot or less than just return. */ dot = cname.lastIndexOf('.'); if (dot == -1) return cname; if (dot == 0) return ""; if (dot == cname.length() - 1) { cname = cname.substring(0, cname.length() -1); dot = cname.lastIndexOf('.'); if (dot == -1) return cname; if (dot == 0) return ""; } if (dot == cname.length() - 1) return ""; /* * Break it up into seperate labels. */ int second = cname.lastIndexOf('.', dot - 1); if (second == -1) return cname; if (second == 0) return ""; int third = cname.lastIndexOf('.', second - 1); int fourth = -1; if (third > 0) { fourth = cname.lastIndexOf('.', third - 1); } int fifth = -1; if (fourth > 0) { fifth = cname.lastIndexOf('.', fourth - 1); } String s = cname.substring(dot + 1); String s2 = cname.substring(second + 1, dot); /* * Look for longest matches first. * XX.PVT.K12.MA.US etc. */ if (fourth != -1 && s.equals("us") && usStateSet.contains(s2)) { String s3 = cname.substring(third + 1, second); String s4 = cname.substring(fourth + 1, third); if (s3.equals("k12")) { if (s2.equals("ma") && (s4.equals("chtr") || s4.equals("paroch"))) { return cname.substring(fifth + 1); } else if (s4.equals("pvt")) { return cname.substring(fifth + 1); } } } /* * XX.K12.MA.US. */ String str = cname.substring(third + 1); if (third != -1) { Set set = top3Map.get(s); if (set != null) { if (set.contains(str)) { return cname.substring(fourth + 1); } } else if (s.equals("us") && usStateSet.contains(s2)) { // check for known third level labels String s3 = cname.substring(third + 1, second); if (usSubStateSet.contains(s3)) { return fourth != -1? cname.substring(fourth + 1): cname; } else { return cname.substring(third + 1); } } else if (s.equals("uk")) { if (s2.equals("sch")) { return cname.substring(fourth + 1); } } else if (s.equals("jp")) { if (jpSet.contains(s2)) { if (jp2Set.contains(str)) { return cname.substring(third + 1); } return cname.substring(fourth + 1); } } } /* * PREF.AKITA.JP etc. */ if (jp2Set.contains(str)) { return cname.substring(third + 1); } /* * XX.MA.US. */ Set topSet = topMap.get(s); if (topSet != null) { if (topSet.contains(s2)) { return cname.substring(third + 1); } if (!((s.equals("us") && usStateSet.contains(s2)) || (s.equals("jp") && jpSet.contains(s2)))) { return cname.substring(second + 1); } } else if (top2Set.contains(s)) { if (s2.equals("gov")) { return cname.substring(third + 1); } return cname.substring(second + 1); } else if (top3Set.contains(s)) { if (s.equals("ad") && s2.equals("nom") || s.equals("aw") && s2.equals("com") || s.equals("be") && s2.equals("ac") || s.equals("cl") && s2.equals("gov") || s.equals("cl") && s2.equals("gob") || s.equals("fi") && s2.equals("aland") || s.equals("int") && s2.equals("eu") || s.equals("io") && s2.equals("com") || s.equals("mc") && s2.equals("tm") || s.equals("mc") && s2.equals("asso") || s.equals("vc") && s2.equals("com")) { return cname.substring(third + 1); } return cname.substring(second + 1); } else if (top4Set.contains(s)) { if (s2.equals("com") || s2.equals("edu") || s2.equals("gov") || s2.equals("net") || s2.equals("org")) { return cname.substring(third + 1); } return cname.substring(second + 1); } else if (top5Set.contains(s)) { return cname.substring(third + 1); } /* * BB.AA exception cases. */ if (s.equals("tr")) { if (!s2.equals("nic") && !s2.equals("tsk")) { return cname.substring(third + 1); } return cname.substring(second + 1); } else if (s.equals("uk")) { if (!ukSet.contains(s2)) { return cname.substring(third + 1); } return cname.substring(second + 1); } else if (s.equals("ar")) { if (!arSet.contains(s2)) { return cname.substring(third + 1); } return cname.substring(second + 1); } else if (s.equals("om")) { if (!omSet.contains(s2)) { return cname.substring(third + 1); } return cname.substring(second + 1); } /* * XX.AA */ if (top1Set.contains(s)) { return cname.substring(second + 1); } /* * Nothing matched so we can't shorten the string. */ return cname; }}Lines 501–879 of 879. Previous lines
"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", "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", "os.hedmark", "os.hordaland", "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", "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"))); topMap.put( "nr", new HashSet<String>(Arrays.asList("biz", "info", "gov", "edu", "org", "net", "com", "co"))); topMap.put( "pa", new HashSet<String>(Arrays.asList("ac", "gob", "com", "org", "sld", "edu", "net", "ing", "abo", "med", "nom"))); topMap.put( "pe", new HashSet<String>(Arrays.asList("edu", "gob", "nom", "mil", "org", "com", "net", "sld"))); topMap.put( "pf", new HashSet<String>(Arrays.asList( "com"))); topMap.put( "ph", new HashSet<String>(Arrays.asList("com", "net", "org", "gov", "edu", "ngo", "mil"))); topMap.put( "pk", new HashSet<String>(Arrays.asList("com", "net", "edu", "org", "fam", "biz", "web", "gov", "gob", "gok", "gon", "gop", "gos", "gog", "gkp", "info"))); topMap.put( "pl", new HashSet<String>(Arrays.asList("aid", "agro", "atm", "auto", "biz", "com", "edu", "gmina", "gsm", "info", "mail", "miasta", "media", "mil", "net", "nieruchomosci", "nom", "org", "pc", "powiat", "priv", "realestate", "rel", "sex", "shop", "sklep", "sos", "szkola", "targi", "tm", "tourism", "travel", "turystyka", "art", "gov", "ngo", "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", "siedlce", "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", "gda", "gdansk", "krakow", "poznan", "wroc", "co", "lodz", "lublin", "torun"))); topMap.put( "pn", new HashSet<String>(Arrays.asList("gov", "co", "org", "edu", "net"))); topMap.put( "pr", new HashSet<String>(Arrays.asList("com", "net", "org", "gov", "edu", "isla", "pro", "biz", "info", "name", "est", "prof", "ac", "gobierno"))); topMap.put( "pro", new HashSet<String>(Arrays.asList("aca", "bar", "cpa", "jur", "law", "med", "eng"))); topMap.put( "ps", new HashSet<String>(Arrays.asList("edu", "gov", "sec", "plo", "com", "org", "net"))); topMap.put( "pt", new HashSet<String>(Arrays.asList("net", "gov", "org", "edu", "int", "publ", "com", "nome"))); topMap.put( "pw", new HashSet<String>(Arrays.asList("co", "ne", "or", "ed", "go", "belau"))); topMap.put( "qa", new HashSet<String>(Arrays.asList("com", "net", "org", "gov", "edu", "mil"))); topMap.put( "re", new HashSet<String>(Arrays.asList("com", "asso", "nom"))); topMap.put( "ro", new HashSet<String>(Arrays.asList("com", "org", "tm", "nt", "nom", "info", "rec", "arts", "firm", "store", "www"))); topMap.put( "rs", new HashSet<String>(Arrays.asList("co", "org", "edu", "ac", "gov", "in"))); topMap.put( "ru", new HashSet<String>(Arrays.asList("ac", "com", "edu", "int", "net", "org", "pp", "adygeya", "altai", "amur", "arkhangelsk", "astrakhan", "bashkiria", "belgorod", "bir", "bryansk", "buryatia", "cap", "cbg", "chel", "chelyabinsk", "chita", "chukotka", "dagestan", "e-burg", "grozny", "irkutsk", "ivanovo", "izhevsk", "jar", "joshkar-ola", "kalmykia", "kaluga", "kamchatka", "karelia", "kazan", "kchr", "kemerovo", "khabarovsk", "khakassia", "khv", "kirov", "koenig", "komi", "kostroma", "krasnoyarsk", "kuban", "kurgan", "kursk", "lipetsk", "magadan", "mari", "mari-el", "marine", "mordovia", "mosreg", "msk", "murmansk", "nalchik", "nnov", "nov", "novosibirsk", "nsk", "omsk", "orenburg", "oryol", "palana", "penza", "perm", "pskov", "ptz", "rnd", "ryazan", "sakhalin", "samara", "saratov", "simbirsk", "smolensk", "spb", "stavropol", "stv", "surgut", "tambov", "tatarstan", "tom", "tomsk", "tsaritsyn", "tsk", "tula", "tuva", "tver", "tyumen", "udm", "udmurtia", "ulan-ude", "vladikavkaz", "vladimir", "vladivostok", "volgograd", "vologda", "voronezh", "vrn", "vyatka", "yakutia", "yamal", "yaroslavl", "yekaterinburg", "yuzhno-sakhalinsk", "amursk", "baikal", "cmw", "fareast", "jamal", "kms", "k-uralsk", "kustanai", "kuzbass", "magnitka", "mytis", "nakhodka", "nkz", "norilsk", "oskol", "pyatigorsk", "rubtsovsk", "snz", "syzran", "vdonsk", "zgrad", "gov", "mil", "test"))); topMap.put( "rw", new HashSet<String>(Arrays.asList("gov", "net", "edu", "ac", "com", "co", "int", "mil", "gouv"))); topMap.put( "sa", new HashSet<String>(Arrays.asList("com", "net", "org", "gov", "med", "pub", "edu", "sch"))); topMap.put( "sd", new HashSet<String>(Arrays.asList("com", "net", "org", "edu", "med", "gov", "info", "tv"))); topMap.put( "se", new HashSet<String>(Arrays.asList("a", "ac", "b", "bd", "brand", "c", "d", "e", "f", "fh", "fhsk", "fhv", "g", "h", "i", "k", "komforb", "kommunalforbund", "komvux", "l", "lanarb", "lanbib", "m", "n", "naturbruksgymn", "o", "org", "p", "parti", "pp", "press", "r", "s", "sshn", "t", "tm", "u", "w", "x", "y", "z"))); topMap.put( "sg", new HashSet<String>(Arrays.asList("com", "net", "org", "gov", "edu", "per"))); topMap.put( "sh", new HashSet<String>(Arrays.asList("co", "com", "net", "org", "gov", "edu", "nom"))); topMap.put( "sk", new HashSet<String>(Arrays.asList("gov", "edu"))); topMap.put( "sn", new HashSet<String>(Arrays.asList("art", "com", "edu", "gouv", "org", "perso", "univ"))); topMap.put( "so", new HashSet<String>(Arrays.asList("com", "net", "org"))); topMap.put( "sr", new HashSet<String>(Arrays.asList("co", "com", "consulado", "edu", "embaixada", "gov", "mil", "net", "org", "principe", "saotome", "store"))); topMap.put( "sy", new HashSet<String>(Arrays.asList("edu", "gov", "net", "mil", "com", "org", "news"))); topMap.put( "sz", new HashSet<String>(Arrays.asList("co", "ac", "org"))); topMap.put( "th", new HashSet<String>(Arrays.asList("ac", "co", "go", "in", "mi", "net", "or"))); topMap.put( "tj", new HashSet<String>(Arrays.asList("ac", "biz", "co", "com", "edu", "go", "gov", "int", "mil", "name", "net", "nic", "org", "test", "web"))); topMap.put( "tn", new HashSet<String>(Arrays.asList("com", "ens", "fin", "gov", "ind", "intl", "nat", "net", "org", "info", "perso", "tourism", "edunet", "rnrt", "rns", "rnu", "mincom", "agrinet", "defense", "turen"))); topMap.put( "to", new HashSet<String>(Arrays.asList("gov"))); topMap.put( "tt", new HashSet<String>(Arrays.asList("co", "com", "org", "net", "biz", "info", "pro", "int", "coop", "jobs", "mobi", "travel", "museum", "aero", "name", "gov", "edu", "cat", "tel", "mil"))); topMap.put( "tw", new HashSet<String>(Arrays.asList("edu", "gov", "mil", "com", "net", "org", "idv", "game", "ebiz", "club", "xn--zf0ao64a", "xn--uc0atv", "xn--czrw28b"))); topMap.put( "ua", new HashSet<String>(Arrays.asList("com", "edu", "gov", "in", "net", "org", "cherkassy", "chernigov", "chernovtsy", "ck", "cn", "crimea", "cv", "dn", "dnepropetrovsk", "donetsk", "dp", "if", "ivano-frankivsk", "kh", "kharkov", "kherson", "kiev", "kirovograd", "km", "kr", "ks", "lg", "lugansk", "lutsk", "lviv", "mk", "nikolaev", "od", "odessa", "pl", "poltava", "rovno", "rv", "sebastopol", "sumy", "te", "ternopil", "uzhgorod", "vinnica", "vn", "zaporizhzhe", "zp", "zhitomir", "zt", "cr", "lt", "lv", "sb", "sm", "tr", "co", "biz", "in", "ne", "pp", "uz", "dominic"))); topMap.put( "ug", new HashSet<String>(Arrays.asList("co", "ac", "sc", "go", "ne", "or", "org", "com"))); topMap.put( "us", new HashSet<String>(Arrays.asList("dni", "fed", "isa", "kids", "nsn", "kyschools"))); topMap.put( "uz", new HashSet<String>(Arrays.asList("co", "com", "org", "gov", "ac", "edu", "int", "pp", "net"))); topMap.put( "vc", new HashSet<String>(Arrays.asList("com", "net", "org", "gov"))); topMap.put( "vi", new HashSet<String>(Arrays.asList("co", "com", "k12", "net", "org"))); topMap.put( "vn", new HashSet<String>(Arrays.asList( "com", "net", "org", "edu", "gov", "int", "ac", "biz", "info", "name", "pro", "health"))); topMap.put( "vu", new HashSet<String>(Arrays.asList("co", "com", "net", "org", "edu", "gov", "de"))); topMap.put("org", new HashSet<String>(Arrays.asList("ae", "za"))); topMap.put("pro", new HashSet<String>(Arrays.asList("aca", "bar", "cpa", "jur", "law", "med", "eng"))); top3Map.put("au", new HashSet<String>(Arrays.asList("act.edu.au", "eq.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", "nsw.gov.au", "nt.gov.au", "qld.gov.au", "sa.gov.au", "tas.gov.au", "vic.gov.au", "wa.gov.au"))); top3Map.put("im", new HashSet<String>(Arrays.asList("ltd.co.im", "plc.co.im"))); top3Map.put("no", new HashSet<String>(Arrays.asList("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", "bo.telemark.no", "xn--b-5ga.telemark.no", "bo.nordland.no", "xn--b-5ga.nordland.no", "heroy.more-og-romsdal.no", "xn--hery-ira.xn--mre-og-romsdal-qqb.no", "heroy.nordland.no", "xn--hery-ira.nordland.no", "nes.akershus.no", "nes.buskerud.no", "os.hedmark.no", "os.hordaland.no", "sande.more-og-romsdal.no", "sande.xn--mre-og-romsdal-qqb.no", "sande.vestfold.no", "valer.ostfold.no", "xn--vler-qoa.xn--stfold-9xa.no", "valer.hedmark.no", "xn--vler-qoa.hedmark.no"))); top3Map.put("tr", new HashSet<String>(Arrays.asList("gov.nc.tr"))); } /* * Return the registered part of a qualified domain * name or the original if no match is found. */ public static String getRegisteredDomain(String cname) { int dot; /* * If one dot or less than just return. */ dot = cname.lastIndexOf('.'); if (dot == -1) return cname; if (dot == 0) return ""; if (dot == cname.length() - 1) { cname = cname.substring(0, cname.length() -1); dot = cname.lastIndexOf('.'); if (dot == -1) return cname; if (dot == 0) return ""; } if (dot == cname.length() - 1) return ""; /* * Break it up into seperate labels. */ int second = cname.lastIndexOf('.', dot - 1); if (second == -1) return cname; if (second == 0) return ""; int third = cname.lastIndexOf('.', second - 1); int fourth = -1; if (third > 0) { fourth = cname.lastIndexOf('.', third - 1); } int fifth = -1; if (fourth > 0) { fifth = cname.lastIndexOf('.', fourth - 1); } String s = cname.substring(dot + 1); String s2 = cname.substring(second + 1, dot); /* * Look for longest matches first. * XX.PVT.K12.MA.US etc. */ if (fourth != -1 && s.equals("us") && usStateSet.contains(s2)) { String s3 = cname.substring(third + 1, second); String s4 = cname.substring(fourth + 1, third); if (s3.equals("k12")) { if (s2.equals("ma") && (s4.equals("chtr") || s4.equals("paroch"))) { return cname.substring(fifth + 1); } else if (s4.equals("pvt")) { return cname.substring(fifth + 1); } } } /* * XX.K12.MA.US. */ String str = cname.substring(third + 1); if (third != -1) { Set set = top3Map.get(s); if (set != null) { if (set.contains(str)) { return cname.substring(fourth + 1); } } else if (s.equals("us") && usStateSet.contains(s2)) { // check for known third level labels String s3 = cname.substring(third + 1, second); if (usSubStateSet.contains(s3)) { return fourth != -1? cname.substring(fourth + 1): cname; } else { return cname.substring(third + 1); } } else if (s.equals("uk")) { if (s2.equals("sch")) { return cname.substring(fourth + 1); } } else if (s.equals("jp")) { if (jpSet.contains(s2)) { if (jp2Set.contains(str)) { return cname.substring(third + 1); } return cname.substring(fourth + 1); } } } /* * PREF.AKITA.JP etc. */ if (jp2Set.contains(str)) { return cname.substring(third + 1); } /* * XX.MA.US. */ Set topSet = topMap.get(s); if (topSet != null) { if (topSet.contains(s2)) { return cname.substring(third + 1); } if (!((s.equals("us") && usStateSet.contains(s2)) || (s.equals("jp") && jpSet.contains(s2)))) { return cname.substring(second + 1); } } else if (top2Set.contains(s)) { if (s2.equals("gov")) { return cname.substring(third + 1); } return cname.substring(second + 1); } else if (top3Set.contains(s)) { if (s.equals("ad") && s2.equals("nom") || s.equals("aw") && s2.equals("com") || s.equals("be") && s2.equals("ac") || s.equals("cl") && s2.equals("gov") || s.equals("cl") && s2.equals("gob") || s.equals("fi") && s2.equals("aland") || s.equals("int") && s2.equals("eu") || s.equals("io") && s2.equals("com") || s.equals("mc") && s2.equals("tm") || s.equals("mc") && s2.equals("asso") || s.equals("vc") && s2.equals("com")) { return cname.substring(third + 1); } return cname.substring(second + 1); } else if (top4Set.contains(s)) { if (s2.equals("com") || s2.equals("edu") || s2.equals("gov") || s2.equals("net") || s2.equals("org")) { return cname.substring(third + 1); } return cname.substring(second + 1); } else if (top5Set.contains(s)) { return cname.substring(third + 1); } /* * BB.AA exception cases. */ if (s.equals("tr")) { if (!s2.equals("nic") && !s2.equals("tsk")) { return cname.substring(third + 1); } return cname.substring(second + 1); } else if (s.equals("uk")) { if (!ukSet.contains(s2)) { return cname.substring(third + 1); } return cname.substring(second + 1); } else if (s.equals("ar")) { if (!arSet.contains(s2)) { return cname.substring(third + 1); } return cname.substring(second + 1); } else if (s.equals("om")) { if (!omSet.contains(s2)) { return cname.substring(third + 1); } return cname.substring(second + 1); } /* * XX.AA */ if (top1Set.contains(s)) { return cname.substring(second + 1); } /* * Nothing matched so we can't shorten the string. */ return cname; } }