1997-12-04 15:44:30 -04:00
|
|
|
|
#! /usr/bin/env python
|
1996-11-18 18:57:43 -04:00
|
|
|
|
|
|
|
|
|
"""Print the long name of an Internet domain.
|
|
|
|
|
|
|
|
|
|
This script will take an Internet address and print out where in the
|
|
|
|
|
world that message originated from, based on the top-level domain code
|
|
|
|
|
found in the address. Addresses can be in any of the following forms:
|
|
|
|
|
|
|
|
|
|
xx -- just the country code or top-level domain identifier
|
|
|
|
|
host.domain.xx -- any Internet host or network name
|
|
|
|
|
somebody@where.xx -- an Internet email address
|
|
|
|
|
|
|
|
|
|
Country codes are maintained by the RIPE Network Coordination Centre,
|
|
|
|
|
in coordination with the ISO 3166 Maintenance Agency at DIN Berlin.
|
|
|
|
|
|
|
|
|
|
<url:ftp://info.ripe.net/iso3166-countrycodes>
|
|
|
|
|
|
|
|
|
|
The latest known change to this information was:
|
|
|
|
|
|
1997-12-04 15:35:25 -04:00
|
|
|
|
Thu Aug 7 17:59:51 MET DST 1997
|
1996-11-18 18:57:43 -04:00
|
|
|
|
|
1996-11-20 14:43:05 -04:00
|
|
|
|
This script also knows about non-geographic top-level domains.
|
|
|
|
|
|
1997-12-04 15:35:25 -04:00
|
|
|
|
Usage: %s [-d] [-p|-P file] [-h] addr [addr ...]
|
1996-11-18 18:57:43 -04:00
|
|
|
|
|
1997-12-04 15:35:25 -04:00
|
|
|
|
--dump
|
|
|
|
|
-d
|
|
|
|
|
Print mapping of all top-level domains.
|
|
|
|
|
|
|
|
|
|
--parse file
|
|
|
|
|
--p file
|
|
|
|
|
--P file
|
|
|
|
|
--Parse file
|
|
|
|
|
Parse an iso3166-countrycodes file (given as the argument).
|
|
|
|
|
This first the two letter country code (it ignores the three
|
|
|
|
|
letter code), followed by the country name. With -P option,
|
|
|
|
|
output is in the form of a Python dictionary, and country
|
|
|
|
|
names are normalized w.r.t. capitalization. This makes it
|
|
|
|
|
appropriate for cutting and pasting back into this file.
|
|
|
|
|
|
|
|
|
|
-h
|
|
|
|
|
--help
|
|
|
|
|
Print this message.
|
1996-11-18 18:57:43 -04:00
|
|
|
|
|
|
|
|
|
"""
|
1997-12-04 15:35:25 -04:00
|
|
|
|
__version__ = '2.0'
|
1996-11-20 11:17:50 -04:00
|
|
|
|
__author__ = 'Barry Warsaw <bwarsaw@python.org>'
|
|
|
|
|
__source__ = '<url:http://www.python.org/~bwarsaw/pyware/>'
|
|
|
|
|
|
1996-11-18 17:26:56 -04:00
|
|
|
|
|
1995-06-15 12:54:16 -03:00
|
|
|
|
import sys
|
1996-11-18 17:26:56 -04:00
|
|
|
|
import string
|
1996-11-18 18:57:43 -04:00
|
|
|
|
import getopt
|
1996-11-18 17:26:56 -04:00
|
|
|
|
|
|
|
|
|
|
1996-11-18 18:57:43 -04:00
|
|
|
|
|
|
|
|
|
def usage(status=0):
|
|
|
|
|
print __doc__ % sys.argv[0]
|
|
|
|
|
sys.exit(status)
|
1996-11-18 17:26:56 -04:00
|
|
|
|
|
1997-12-04 15:35:25 -04:00
|
|
|
|
|
1996-11-18 17:26:56 -04:00
|
|
|
|
def resolve(rawaddr):
|
|
|
|
|
parts = string.splitfields(rawaddr, '.')
|
|
|
|
|
if not len(parts):
|
|
|
|
|
print 'No top-level domain in:', rawaddr
|
|
|
|
|
return
|
|
|
|
|
addr = parts[-1]
|
|
|
|
|
if nameorg.has_key(addr):
|
1996-11-20 14:43:05 -04:00
|
|
|
|
print rawaddr, 'is from a', nameorg[addr], 'organization'
|
1996-11-18 17:26:56 -04:00
|
|
|
|
elif country.has_key(addr):
|
1996-11-19 13:59:07 -04:00
|
|
|
|
print rawaddr, 'originated from', country[addr]
|
1996-11-18 17:26:56 -04:00
|
|
|
|
else:
|
1996-11-19 13:59:07 -04:00
|
|
|
|
print 'Where in the world is %s?' % rawaddr
|
1996-11-18 18:57:43 -04:00
|
|
|
|
|
|
|
|
|
|
1997-12-04 15:35:25 -04:00
|
|
|
|
|
|
|
|
|
def parse(file, normalize):
|
1997-12-04 15:44:30 -04:00
|
|
|
|
try:
|
|
|
|
|
import re
|
|
|
|
|
except ImportError:
|
|
|
|
|
print 'Parsing requires Python 1.5'
|
|
|
|
|
sys.exit(1)
|
|
|
|
|
|
1997-12-04 15:35:25 -04:00
|
|
|
|
try:
|
|
|
|
|
fp = open(file)
|
|
|
|
|
except IOError, (err, msg):
|
|
|
|
|
print msg, ':', file
|
|
|
|
|
|
|
|
|
|
cre = re.compile('(.*?)[ \t]+([A-Z]{2})[ \t]+[A-Z]{3}[ \t]+[0-9]{3}')
|
|
|
|
|
scanning = 0
|
|
|
|
|
|
|
|
|
|
if normalize:
|
|
|
|
|
print 'country = {'
|
|
|
|
|
|
|
|
|
|
while 1:
|
|
|
|
|
line = fp.readline()
|
|
|
|
|
if line == '':
|
|
|
|
|
break # EOF
|
|
|
|
|
if scanning:
|
|
|
|
|
mo = cre.match(line)
|
|
|
|
|
if not mo:
|
|
|
|
|
line = string.strip(line)
|
|
|
|
|
if not line:
|
|
|
|
|
continue
|
|
|
|
|
elif line[0] == '-':
|
|
|
|
|
break
|
|
|
|
|
else:
|
|
|
|
|
print 'Could not parse line:', line
|
|
|
|
|
continue
|
|
|
|
|
country, code = mo.group(1, 2)
|
|
|
|
|
if normalize:
|
|
|
|
|
words = string.split(country)
|
|
|
|
|
for i in range(len(words)):
|
|
|
|
|
w = words[i]
|
|
|
|
|
# XXX special cases
|
|
|
|
|
if w in ('AND', 'OF', 'OF)', 'name:', 'METROPOLITAN'):
|
|
|
|
|
words[i] = string.lower(w)
|
|
|
|
|
elif w == 'THE' and i <> 1:
|
|
|
|
|
words[i] = string.lower(w)
|
|
|
|
|
elif len(w) > 3 and w[1] == "'":
|
|
|
|
|
words[i] = string.upper(w[0:3]) + \
|
|
|
|
|
string.lower(w[3:])
|
|
|
|
|
elif w == '(U.S.)':
|
|
|
|
|
pass
|
|
|
|
|
elif w[0] == '(' and w <> '(local':
|
|
|
|
|
words[i] = '(' + string.capitalize(w[1:])
|
|
|
|
|
elif string.find(w, '-'):
|
|
|
|
|
words[i] = string.join(
|
|
|
|
|
map(string.capitalize, string.split(w, '-')),
|
|
|
|
|
'-')
|
|
|
|
|
else:
|
|
|
|
|
words[i] = string.capitalize(w)
|
|
|
|
|
code = string.lower(code)
|
|
|
|
|
country = string.join(words)
|
|
|
|
|
print ' "%s": "%s",' % (code, country)
|
|
|
|
|
else:
|
|
|
|
|
print code, country
|
|
|
|
|
|
|
|
|
|
elif line[0] == '-':
|
|
|
|
|
scanning = 1
|
|
|
|
|
|
|
|
|
|
if normalize:
|
|
|
|
|
print ' }'
|
|
|
|
|
|
1996-11-18 18:57:43 -04:00
|
|
|
|
|
|
|
|
|
def main():
|
|
|
|
|
help = 0
|
|
|
|
|
status = 0
|
|
|
|
|
dump = 0
|
1997-12-04 15:35:25 -04:00
|
|
|
|
parsefile = None
|
|
|
|
|
normalize = 0
|
1994-07-25 18:52:13 -03:00
|
|
|
|
|
1997-12-04 15:35:25 -04:00
|
|
|
|
opts, args = getopt.getopt(sys.argv[1:],
|
|
|
|
|
'p:P:hd',
|
|
|
|
|
['parse', 'Parse', 'PARSE', 'help', 'dump'])
|
1996-11-18 18:57:43 -04:00
|
|
|
|
for arg, val in opts:
|
|
|
|
|
if arg in ('-h', '--help'):
|
|
|
|
|
help = 1
|
|
|
|
|
elif arg in ('-d', '--dump'):
|
|
|
|
|
dump = 1
|
1997-12-04 15:35:25 -04:00
|
|
|
|
elif arg in ('-p', '--parse'):
|
|
|
|
|
parsefile = val
|
|
|
|
|
elif arg in ('-P', '--Parse', '--PARSE'):
|
|
|
|
|
parsefile = val
|
|
|
|
|
normalize = 1
|
1996-11-18 18:57:43 -04:00
|
|
|
|
|
|
|
|
|
if help:
|
|
|
|
|
usage(status)
|
|
|
|
|
|
|
|
|
|
if dump:
|
1996-11-20 14:43:05 -04:00
|
|
|
|
print 'Non-geographic domains:'
|
1996-11-18 18:57:43 -04:00
|
|
|
|
codes = nameorg.keys()
|
|
|
|
|
codes.sort()
|
|
|
|
|
for code in codes:
|
|
|
|
|
print ' %4s:' % code, nameorg[code]
|
|
|
|
|
|
|
|
|
|
print '\nCountry coded domains:'
|
|
|
|
|
codes = country.keys()
|
|
|
|
|
codes.sort()
|
|
|
|
|
for code in codes:
|
|
|
|
|
print ' %2s:' % code, country[code]
|
1997-12-04 15:35:25 -04:00
|
|
|
|
elif parsefile:
|
|
|
|
|
parse(parsefile, normalize)
|
1996-11-18 18:57:43 -04:00
|
|
|
|
else:
|
|
|
|
|
map(resolve, args)
|
1994-07-25 18:52:13 -03:00
|
|
|
|
|
1997-12-04 15:35:25 -04:00
|
|
|
|
|
1996-11-18 17:26:56 -04:00
|
|
|
|
|
1994-07-25 18:52:13 -03:00
|
|
|
|
# The mappings
|
1995-06-15 12:54:16 -03:00
|
|
|
|
nameorg = {
|
|
|
|
|
"arpa": "Arpanet",
|
|
|
|
|
"com": "commercial",
|
|
|
|
|
"edu": "educational",
|
|
|
|
|
"gov": "government",
|
|
|
|
|
"mil": "military",
|
|
|
|
|
"net": "networking",
|
|
|
|
|
"org": "non-commercial",
|
1996-11-18 17:26:56 -04:00
|
|
|
|
"int": "international",
|
1995-06-15 12:54:16 -03:00
|
|
|
|
}
|
1994-07-25 18:52:13 -03:00
|
|
|
|
|
|
|
|
|
|
1996-11-18 17:26:56 -04:00
|
|
|
|
|
1995-06-15 12:54:16 -03:00
|
|
|
|
country = {
|
1996-11-18 19:22:34 -04:00
|
|
|
|
"af": "Afghanistan",
|
1995-06-15 12:54:16 -03:00
|
|
|
|
"al": "Albania",
|
1996-11-18 19:22:34 -04:00
|
|
|
|
"dz": "Algeria",
|
|
|
|
|
"as": "American Samoa",
|
|
|
|
|
"ad": "Andorra",
|
|
|
|
|
"ao": "Angola",
|
|
|
|
|
"ai": "Anguilla",
|
1995-06-15 12:54:16 -03:00
|
|
|
|
"aq": "Antarctica",
|
1996-11-18 19:22:34 -04:00
|
|
|
|
"ag": "Antigua and Barbuda",
|
1995-06-15 12:54:16 -03:00
|
|
|
|
"ar": "Argentina",
|
1996-11-18 19:22:34 -04:00
|
|
|
|
"am": "Armenia",
|
|
|
|
|
"aw": "Aruba",
|
1995-06-15 12:54:16 -03:00
|
|
|
|
"au": "Australia",
|
1996-11-18 19:22:34 -04:00
|
|
|
|
"at": "Austria",
|
|
|
|
|
"az": "Azerbaijan",
|
|
|
|
|
"bs": "Bahamas",
|
|
|
|
|
"bh": "Bahrain",
|
|
|
|
|
"bd": "Bangladesh",
|
1995-06-15 12:54:16 -03:00
|
|
|
|
"bb": "Barbados",
|
1996-11-18 19:22:34 -04:00
|
|
|
|
"by": "Belarus",
|
1995-06-15 12:54:16 -03:00
|
|
|
|
"be": "Belgium",
|
1996-11-18 19:22:34 -04:00
|
|
|
|
"bz": "Belize",
|
|
|
|
|
"bj": "Benin",
|
|
|
|
|
"bm": "Bermuda",
|
|
|
|
|
"bt": "Bhutan",
|
1995-06-15 12:54:16 -03:00
|
|
|
|
"bo": "Bolivia",
|
1996-11-18 19:22:34 -04:00
|
|
|
|
"ba": "Bosnia and Herzegowina",
|
|
|
|
|
"bw": "Botswana",
|
|
|
|
|
"bv": "Bouvet Island",
|
1995-06-15 12:54:16 -03:00
|
|
|
|
"br": "Brazil",
|
1996-11-18 19:22:34 -04:00
|
|
|
|
"io": "British Indian Ocean Territory",
|
|
|
|
|
"bn": "Brunei Darussalam",
|
|
|
|
|
"bg": "Bulgaria",
|
|
|
|
|
"bf": "Burkina Faso",
|
|
|
|
|
"bi": "Burundi",
|
|
|
|
|
"kh": "Cambodia",
|
|
|
|
|
"cm": "Cameroon",
|
1995-06-15 12:54:16 -03:00
|
|
|
|
"ca": "Canada",
|
1996-11-18 19:22:34 -04:00
|
|
|
|
"cv": "Cape Verde",
|
|
|
|
|
"ky": "Cayman Islands",
|
|
|
|
|
"cf": "Central African Republic",
|
|
|
|
|
"td": "Chad",
|
1995-06-15 12:54:16 -03:00
|
|
|
|
"cl": "Chile",
|
|
|
|
|
"cn": "China",
|
1996-11-18 19:22:34 -04:00
|
|
|
|
"cx": "Christmas Island",
|
|
|
|
|
"cc": "Cocos (Keeling) Islands",
|
1995-06-15 12:54:16 -03:00
|
|
|
|
"co": "Colombia",
|
1996-11-18 19:22:34 -04:00
|
|
|
|
"km": "Comoros",
|
|
|
|
|
"cg": "Congo",
|
1997-12-04 15:42:36 -04:00
|
|
|
|
"cd": "Congo, The Democratic Republic of the",
|
1996-11-18 19:22:34 -04:00
|
|
|
|
"ck": "Cook Islands",
|
1995-06-15 12:54:16 -03:00
|
|
|
|
"cr": "Costa Rica",
|
1997-12-04 15:42:36 -04:00
|
|
|
|
"ci": "Cote D'Ivoire",
|
1996-11-18 19:22:34 -04:00
|
|
|
|
"hr": "Croatia (local name: Hrvatska)",
|
|
|
|
|
"cu": "Cuba",
|
1995-06-15 12:54:16 -03:00
|
|
|
|
"cy": "Cyprus",
|
|
|
|
|
"cz": "Czech Republic",
|
|
|
|
|
"dk": "Denmark",
|
1996-11-18 19:22:34 -04:00
|
|
|
|
"dj": "Djibouti",
|
1995-06-15 12:54:16 -03:00
|
|
|
|
"dm": "Dominica",
|
|
|
|
|
"do": "Dominican Republic",
|
1996-11-18 19:22:34 -04:00
|
|
|
|
"tp": "East Timor",
|
1995-06-15 12:54:16 -03:00
|
|
|
|
"ec": "Ecuador",
|
|
|
|
|
"eg": "Egypt",
|
1996-11-18 19:22:34 -04:00
|
|
|
|
"sv": "El Salvador",
|
|
|
|
|
"gq": "Equatorial Guinea",
|
|
|
|
|
"er": "Eritrea",
|
|
|
|
|
"ee": "Estonia",
|
|
|
|
|
"et": "Ethiopia",
|
|
|
|
|
"fk": "Falkland Islands (Malvinas)",
|
|
|
|
|
"fo": "Faroe Islands",
|
1995-06-15 12:54:16 -03:00
|
|
|
|
"fj": "Fiji",
|
1996-11-18 19:22:34 -04:00
|
|
|
|
"fi": "Finland",
|
1995-06-15 12:54:16 -03:00
|
|
|
|
"fr": "France",
|
1997-12-04 15:42:36 -04:00
|
|
|
|
"fx": "France, metropolitan",
|
1996-11-18 19:22:34 -04:00
|
|
|
|
"gf": "French Guiana",
|
|
|
|
|
"pf": "French Polynesia",
|
|
|
|
|
"tf": "French Southern Territories",
|
|
|
|
|
"ga": "Gabon",
|
|
|
|
|
"gm": "Gambia",
|
|
|
|
|
"ge": "Georgia",
|
|
|
|
|
"de": "Germany",
|
1995-06-15 12:54:16 -03:00
|
|
|
|
"gh": "Ghana",
|
1996-11-18 19:22:34 -04:00
|
|
|
|
"gi": "Gibraltar",
|
1995-06-15 12:54:16 -03:00
|
|
|
|
"gr": "Greece",
|
1996-11-18 19:22:34 -04:00
|
|
|
|
"gl": "Greenland",
|
|
|
|
|
"gd": "Grenada",
|
|
|
|
|
"gp": "Guadeloupe",
|
|
|
|
|
"gu": "Guam",
|
|
|
|
|
"gt": "Guatemala",
|
|
|
|
|
"gn": "Guinea",
|
1997-12-04 15:42:36 -04:00
|
|
|
|
"gw": "Guinea-Bissau",
|
1996-11-18 19:22:34 -04:00
|
|
|
|
"gy": "Guyana",
|
|
|
|
|
"ht": "Haiti",
|
1997-12-04 15:42:36 -04:00
|
|
|
|
"hm": "Heard and Mc Donald Islands",
|
|
|
|
|
"va": "Holy See (Vatican City State)",
|
1996-11-18 19:22:34 -04:00
|
|
|
|
"hn": "Honduras",
|
1995-06-15 12:54:16 -03:00
|
|
|
|
"hk": "Hong Kong",
|
|
|
|
|
"hu": "Hungary",
|
1996-11-18 19:22:34 -04:00
|
|
|
|
"is": "Iceland",
|
|
|
|
|
"in": "India",
|
1995-06-15 12:54:16 -03:00
|
|
|
|
"id": "Indonesia",
|
1996-11-18 19:22:34 -04:00
|
|
|
|
"ir": "Iran (Islamic Republic of)",
|
|
|
|
|
"iq": "Iraq",
|
1995-06-15 12:54:16 -03:00
|
|
|
|
"ie": "Ireland",
|
|
|
|
|
"il": "Israel",
|
|
|
|
|
"it": "Italy",
|
|
|
|
|
"jm": "Jamaica",
|
|
|
|
|
"jp": "Japan",
|
1996-11-18 19:22:34 -04:00
|
|
|
|
"jo": "Jordan",
|
|
|
|
|
"kz": "Kazakhstan",
|
|
|
|
|
"ke": "Kenya",
|
|
|
|
|
"ki": "Kiribati",
|
|
|
|
|
"kp": "Korea, Democratic People's Republic of",
|
|
|
|
|
"kr": "Korea, Republic of",
|
1995-06-15 12:54:16 -03:00
|
|
|
|
"kw": "Kuwait",
|
1996-11-18 19:22:34 -04:00
|
|
|
|
"kg": "Kyrgyzstan",
|
|
|
|
|
"la": "Lao People's Democratic Republic",
|
|
|
|
|
"lv": "Latvia",
|
|
|
|
|
"lb": "Lebanon",
|
|
|
|
|
"ls": "Lesotho",
|
|
|
|
|
"lr": "Liberia",
|
|
|
|
|
"ly": "Libyan Arab Jamahiriya",
|
1995-06-15 12:54:16 -03:00
|
|
|
|
"li": "Liechtenstein",
|
1996-11-18 19:22:34 -04:00
|
|
|
|
"lt": "Lithuania",
|
1995-06-15 12:54:16 -03:00
|
|
|
|
"lu": "Luxembourg",
|
1996-11-18 19:22:34 -04:00
|
|
|
|
"mo": "Macau",
|
1997-12-04 15:42:36 -04:00
|
|
|
|
"mk": "Macedonia, The Former Yugoslav Republic of",
|
1996-11-18 19:22:34 -04:00
|
|
|
|
"mg": "Madagascar",
|
|
|
|
|
"mw": "Malawi",
|
1995-06-15 12:54:16 -03:00
|
|
|
|
"my": "Malaysia",
|
1996-11-18 19:22:34 -04:00
|
|
|
|
"mv": "Maldives",
|
|
|
|
|
"ml": "Mali",
|
|
|
|
|
"mt": "Malta",
|
|
|
|
|
"mh": "Marshall Islands",
|
|
|
|
|
"mq": "Martinique",
|
|
|
|
|
"mr": "Mauritania",
|
|
|
|
|
"mu": "Mauritius",
|
|
|
|
|
"yt": "Mayotte",
|
1995-06-15 12:54:16 -03:00
|
|
|
|
"mx": "Mexico",
|
1996-11-18 19:22:34 -04:00
|
|
|
|
"fm": "Micronesia, Federated States of",
|
|
|
|
|
"md": "Moldova, Republic of",
|
|
|
|
|
"mc": "Monaco",
|
|
|
|
|
"mn": "Mongolia",
|
|
|
|
|
"ms": "Montserrat",
|
|
|
|
|
"ma": "Morocco",
|
|
|
|
|
"mz": "Mozambique",
|
|
|
|
|
"mm": "Myanmar",
|
1995-06-15 12:54:16 -03:00
|
|
|
|
"na": "Namibia",
|
1996-11-18 19:22:34 -04:00
|
|
|
|
"nr": "Nauru",
|
|
|
|
|
"np": "Nepal",
|
1995-06-15 12:54:16 -03:00
|
|
|
|
"nl": "Netherlands",
|
1996-11-18 19:22:34 -04:00
|
|
|
|
"an": "Netherlands Antilles",
|
|
|
|
|
"nc": "New Caledonia",
|
1995-06-15 12:54:16 -03:00
|
|
|
|
"nz": "New Zealand",
|
1996-11-18 19:22:34 -04:00
|
|
|
|
"ni": "Nicaragua",
|
|
|
|
|
"ne": "Niger",
|
|
|
|
|
"ng": "Nigeria",
|
|
|
|
|
"nu": "Niue",
|
|
|
|
|
"nf": "Norfolk Island",
|
|
|
|
|
"mp": "Northern Mariana Islands",
|
|
|
|
|
"no": "Norway",
|
|
|
|
|
"om": "Oman",
|
|
|
|
|
"pk": "Pakistan",
|
|
|
|
|
"pw": "Palau",
|
|
|
|
|
"pa": "Panama",
|
1995-06-15 12:54:16 -03:00
|
|
|
|
"pg": "Papua New Guinea",
|
1996-11-18 19:22:34 -04:00
|
|
|
|
"py": "Paraguay",
|
|
|
|
|
"pe": "Peru",
|
1995-06-15 12:54:16 -03:00
|
|
|
|
"ph": "Philippines",
|
1996-11-18 19:22:34 -04:00
|
|
|
|
"pn": "Pitcairn",
|
1995-06-15 12:54:16 -03:00
|
|
|
|
"pl": "Poland",
|
|
|
|
|
"pt": "Portugal",
|
1996-11-18 19:22:34 -04:00
|
|
|
|
"pr": "Puerto Rico",
|
|
|
|
|
"qa": "Qatar",
|
|
|
|
|
"re": "Reunion",
|
1995-06-15 12:54:16 -03:00
|
|
|
|
"ro": "Romania",
|
1996-11-18 19:22:34 -04:00
|
|
|
|
"ru": "Russian Federation",
|
|
|
|
|
"rw": "Rwanda",
|
|
|
|
|
"kn": "Saint Kitts and Nevis",
|
|
|
|
|
"lc": "Saint Lucia",
|
|
|
|
|
"vc": "Saint Vincent and the Grenadines",
|
|
|
|
|
"ws": "Samoa",
|
|
|
|
|
"sm": "San Marino",
|
|
|
|
|
"st": "Sao Tome and Principe",
|
|
|
|
|
"sa": "Saudi Arabia",
|
|
|
|
|
"sn": "Senegal",
|
|
|
|
|
"sc": "Seychelles",
|
|
|
|
|
"sl": "Sierra Leone",
|
1995-06-15 12:54:16 -03:00
|
|
|
|
"sg": "Singapore",
|
1996-11-18 19:22:34 -04:00
|
|
|
|
"sk": "Slovakia (Slovak Republic)",
|
1995-06-15 12:54:16 -03:00
|
|
|
|
"si": "Slovenia",
|
1996-11-18 19:22:34 -04:00
|
|
|
|
"sb": "Solomon Islands",
|
|
|
|
|
"so": "Somalia",
|
|
|
|
|
"za": "South Africa",
|
|
|
|
|
"gs": "South Georgia and the South Sandwich Islands",
|
|
|
|
|
"es": "Spain",
|
|
|
|
|
"lk": "Sri Lanka",
|
|
|
|
|
"sh": "St. Helena",
|
|
|
|
|
"pm": "St. Pierre and Miquelon",
|
|
|
|
|
"sd": "Sudan",
|
1995-06-15 12:54:16 -03:00
|
|
|
|
"sr": "Suriname",
|
1996-11-18 19:22:34 -04:00
|
|
|
|
"sj": "Svalbard and Jan Mayen Islands",
|
|
|
|
|
"sz": "Swaziland",
|
|
|
|
|
"se": "Sweden",
|
|
|
|
|
"ch": "Switzerland",
|
|
|
|
|
"sy": "Syrian Arab Republic",
|
|
|
|
|
"tw": "Taiwan, Province of China",
|
|
|
|
|
"tj": "Tajikistan",
|
|
|
|
|
"tz": "Tanzania, United Republic of",
|
1995-06-15 12:54:16 -03:00
|
|
|
|
"th": "Thailand",
|
1996-11-18 19:22:34 -04:00
|
|
|
|
"tg": "Togo",
|
|
|
|
|
"tk": "Tokelau",
|
|
|
|
|
"to": "Tonga",
|
|
|
|
|
"tt": "Trinidad and Tobago",
|
1995-06-15 12:54:16 -03:00
|
|
|
|
"tn": "Tunisia",
|
|
|
|
|
"tr": "Turkey",
|
1996-11-18 19:22:34 -04:00
|
|
|
|
"tm": "Turkmenistan",
|
|
|
|
|
"tc": "Turks and Caicos Islands",
|
|
|
|
|
"tv": "Tuvalu",
|
|
|
|
|
"ug": "Uganda",
|
|
|
|
|
"ua": "Ukraine",
|
|
|
|
|
"ae": "United Arab Emirates",
|
|
|
|
|
"gb": "United Kingdom",
|
1995-06-15 12:54:16 -03:00
|
|
|
|
"us": "United States",
|
1996-11-18 19:22:34 -04:00
|
|
|
|
"um": "United States Minor Outlying Islands",
|
1995-06-15 12:54:16 -03:00
|
|
|
|
"uy": "Uruguay",
|
1996-11-18 19:22:34 -04:00
|
|
|
|
"uz": "Uzbekistan",
|
|
|
|
|
"vu": "Vanuatu",
|
1995-06-15 12:54:16 -03:00
|
|
|
|
"ve": "Venezuela",
|
1996-11-18 19:22:34 -04:00
|
|
|
|
"vn": "Viet Nam",
|
|
|
|
|
"vg": "Virgin Islands (British)",
|
|
|
|
|
"vi": "Virgin Islands (U.S.)",
|
|
|
|
|
"wf": "Wallis and Futuna Islands",
|
|
|
|
|
"eh": "Western Sahara",
|
|
|
|
|
"ye": "Yemen",
|
1995-06-15 12:54:16 -03:00
|
|
|
|
"yu": "Yugoslavia",
|
1996-11-18 19:22:34 -04:00
|
|
|
|
"zm": "Zambia",
|
1996-11-18 17:26:56 -04:00
|
|
|
|
"zw": "Zimbabwe",
|
1995-06-15 12:54:16 -03:00
|
|
|
|
}
|
1994-07-25 18:52:13 -03:00
|
|
|
|
|
1996-11-18 17:26:56 -04:00
|
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
1996-11-18 18:57:43 -04:00
|
|
|
|
main()
|