From f3b86ed2d5bce85b3b9c27eb949cd88cf7d526bc Mon Sep 17 00:00:00 2001 From: Alexander Sulfrian Date: Thu, 25 Jul 2013 19:26:52 +0200 Subject: fix indentation and trailing whitespaces --- __init__.py | 88 +- bot.py | 430 +-- icao.py | 8376 ++++++++++++++++++++++++------------------------- irc.py | 388 +-- modules/admin.py | 74 +- modules/calc.py | 160 +- modules/clock.py | 494 +-- modules/codepoints.py | 230 +- modules/etymology.py | 160 +- modules/head.py | 322 +- modules/info.py | 118 +- modules/oblique.py | 190 +- modules/ping.py | 16 +- modules/reload.py | 76 +- modules/remind.py | 292 +- modules/search.py | 414 +-- modules/seen.py | 68 +- modules/startup.py | 92 +- modules/tell.py | 250 +- modules/translate.py | 206 +- modules/twitter.py | 106 +- modules/validate.py | 58 +- modules/weather.py | 786 ++--- modules/wikipedia.py | 306 +- modules/wiktionary.py | 140 +- opt/freenode.py | 50 +- tools.py | 30 +- web.py | 94 +- 28 files changed, 7007 insertions(+), 7007 deletions(-) diff --git a/__init__.py b/__init__.py index fa76316..6c94555 100755 --- a/__init__.py +++ b/__init__.py @@ -10,58 +10,58 @@ http://inamidst.com/phenny/ import sys, os, time, threading, signal import bot -class Watcher(object): - # Cf. http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/496735 - def __init__(self): - self.child = os.fork() - if self.child != 0: - signal.signal(signal.SIGTERM, self.sig_term) - self.watch() +class Watcher(object): + # Cf. http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/496735 + def __init__(self): + self.child = os.fork() + if self.child != 0: + signal.signal(signal.SIGTERM, self.sig_term) + self.watch() - def watch(self): - try: os.wait() - except KeyboardInterrupt: - self.kill() - sys.exit() + def watch(self): + try: os.wait() + except KeyboardInterrupt: + self.kill() + sys.exit() - def kill(self): - try: os.kill(self.child, signal.SIGKILL) - except OSError: pass + def kill(self): + try: os.kill(self.child, signal.SIGKILL) + except OSError: pass - def sig_term(self, signum, frame): - self.kill() - sys.exit() + def sig_term(self, signum, frame): + self.kill() + sys.exit() -def run_phenny(config): - if hasattr(config, 'delay'): - delay = config.delay - else: delay = 20 +def run_phenny(config): + if hasattr(config, 'delay'): + delay = config.delay + else: delay = 20 - def connect(config): - p = bot.Phenny(config) - p.run(config.host, config.port) + def connect(config): + p = bot.Phenny(config) + p.run(config.host, config.port) - try: Watcher() - except Exception, e: - print >> sys.stderr, 'Warning:', e, '(in __init__.py)' + try: Watcher() + except Exception, e: + print >> sys.stderr, 'Warning:', e, '(in __init__.py)' - while True: - try: connect(config) - except KeyboardInterrupt: - sys.exit() + while True: + try: connect(config) + except KeyboardInterrupt: + sys.exit() - if not isinstance(delay, int): - break + if not isinstance(delay, int): + break - warning = 'Warning: Disconnected. Reconnecting in %s seconds...' % delay - print >> sys.stderr, warning - time.sleep(delay) + warning = 'Warning: Disconnected. Reconnecting in %s seconds...' % delay + print >> sys.stderr, warning + time.sleep(delay) -def run(config): - t = threading.Thread(target=run_phenny, args=(config,)) - if hasattr(t, 'run'): - t.run() - else: t.start() +def run(config): + t = threading.Thread(target=run_phenny, args=(config,)) + if hasattr(t, 'run'): + t.run() + else: t.start() -if __name__ == '__main__': - print __doc__ +if __name__ == '__main__': + print __doc__ diff --git a/bot.py b/bot.py index e45c035..66a88b2 100755 --- a/bot.py +++ b/bot.py @@ -12,218 +12,218 @@ import irc home = os.getcwd() -def decode(bytes): - try: text = bytes.decode('utf-8') - except UnicodeDecodeError: - try: text = bytes.decode('iso-8859-1') - except UnicodeDecodeError: - text = bytes.decode('cp1252') - return text - -class Phenny(irc.Bot): - def __init__(self, config): - args = (config.nick, config.name, config.channels, config.password) - irc.Bot.__init__(self, *args) - self.config = config - self.doc = {} - self.stats = {} - self.setup() - - def setup(self): - self.variables = {} - - filenames = [] - if not hasattr(self.config, 'enable'): - for fn in os.listdir(os.path.join(home, 'modules')): - if fn.endswith('.py') and not fn.startswith('_'): - filenames.append(os.path.join(home, 'modules', fn)) - else: - for fn in self.config.enable: - filenames.append(os.path.join(home, 'modules', fn + '.py')) - - if hasattr(self.config, 'extra'): - for fn in self.config.extra: - if os.path.isfile(fn): - filenames.append(fn) - elif os.path.isdir(fn): - for n in os.listdir(fn): - if n.endswith('.py') and not n.startswith('_'): - filenames.append(os.path.join(fn, n)) - - modules = [] - excluded_modules = getattr(self.config, 'exclude', []) - for filename in filenames: - name = os.path.basename(filename)[:-3] - if name in excluded_modules: continue - # if name in sys.modules: - # del sys.modules[name] - try: module = imp.load_source(name, filename) - except Exception, e: - print >> sys.stderr, "Error loading %s: %s (in bot.py)" % (name, e) - else: - if hasattr(module, 'setup'): - module.setup(self) - self.register(vars(module)) - modules.append(name) - - if modules: - print >> sys.stderr, 'Registered modules:', ', '.join(modules) - else: print >> sys.stderr, "Warning: Couldn't find any modules" - - self.bind_commands() - - def register(self, variables): - # This is used by reload.py, hence it being methodised - for name, obj in variables.iteritems(): - if hasattr(obj, 'commands') or hasattr(obj, 'rule'): - self.variables[name] = obj - - def bind_commands(self): - self.commands = {'high': {}, 'medium': {}, 'low': {}} - - def bind(self, priority, regexp, func): - print priority, regexp.pattern.encode('utf-8'), func - # register documentation - if not hasattr(func, 'name'): - func.name = func.__name__ - if func.__doc__: - if hasattr(func, 'example'): - example = func.example - example = example.replace('$nickname', self.nick) - else: example = None - self.doc[func.name] = (func.__doc__, example) - self.commands[priority].setdefault(regexp, []).append(func) - - def sub(pattern, self=self): - # These replacements have significant order - pattern = pattern.replace('$nickname', re.escape(self.nick)) - return pattern.replace('$nick', r'%s[,:] +' % re.escape(self.nick)) - - for name, func in self.variables.iteritems(): - # print name, func - if not hasattr(func, 'priority'): - func.priority = 'medium' - - if not hasattr(func, 'thread'): - func.thread = True - - if not hasattr(func, 'event'): - func.event = 'PRIVMSG' - else: func.event = func.event.upper() - - if hasattr(func, 'rule'): - if isinstance(func.rule, str): - pattern = sub(func.rule) - regexp = re.compile(pattern) - bind(self, func.priority, regexp, func) - - if isinstance(func.rule, tuple): - # 1) e.g. ('$nick', '(.*)') - if len(func.rule) == 2 and isinstance(func.rule[0], str): - prefix, pattern = func.rule - prefix = sub(prefix) - regexp = re.compile(prefix + pattern) - bind(self, func.priority, regexp, func) - - # 2) e.g. (['p', 'q'], '(.*)') - elif len(func.rule) == 2 and isinstance(func.rule[0], list): - prefix = self.config.prefix - commands, pattern = func.rule - for command in commands: - command = r'(%s)\b(?: +(?:%s))?' % (command, pattern) - regexp = re.compile(prefix + command) - bind(self, func.priority, regexp, func) - - # 3) e.g. ('$nick', ['p', 'q'], '(.*)') - elif len(func.rule) == 3: - prefix, commands, pattern = func.rule - prefix = sub(prefix) - for command in commands: - command = r'(%s) +' % command - regexp = re.compile(prefix + command + pattern) - bind(self, func.priority, regexp, func) - - if hasattr(func, 'commands'): - for command in func.commands: - template = r'^%s(%s)(?: +(.*))?$' - pattern = template % (self.config.prefix, command) - regexp = re.compile(pattern) - bind(self, func.priority, regexp, func) - - def wrapped(self, origin, text, match): - class PhennyWrapper(object): - def __init__(self, phenny): - self.bot = phenny - - def __getattr__(self, attr): - sender = origin.sender or text - if attr == 'reply': - return (lambda msg: - self.bot.msg(sender, origin.nick + ': ' + msg)) - elif attr == 'say': - return lambda msg: self.bot.msg(sender, msg) - return getattr(self.bot, attr) - - return PhennyWrapper(self) - - def input(self, origin, text, bytes, match, event, args): - class CommandInput(unicode): - def __new__(cls, text, origin, bytes, match, event, args): - s = unicode.__new__(cls, text) - s.sender = origin.sender - s.nick = origin.nick - s.event = event - s.bytes = bytes - s.match = match - s.group = match.group - s.groups = match.groups - s.args = args - s.admin = origin.nick in self.config.admins - s.owner = origin.nick == self.config.owner - return s - - return CommandInput(text, origin, bytes, match, event, args) - - def call(self, func, origin, phenny, input): - try: func(phenny, input) - except Exception, e: - self.error(origin) - - def limit(self, origin, func): - if origin.sender and origin.sender.startswith('#'): - if hasattr(self.config, 'limit'): - limits = self.config.limit.get(origin.sender) - if limits and (func.__module__ not in limits): - return True - return False - - def dispatch(self, origin, args): - bytes, event, args = args[0], args[1], args[2:] - text = decode(bytes) - - for priority in ('high', 'medium', 'low'): - items = self.commands[priority].items() - for regexp, funcs in items: - for func in funcs: - if event != func.event and func.event != '*': continue - - match = regexp.match(text) - if match: - if self.limit(origin, func): continue - - phenny = self.wrapped(origin, text, match) - input = self.input(origin, text, bytes, match, event, args) - - if func.thread: - targs = (func, origin, phenny, input) - t = threading.Thread(target=self.call, args=targs) - t.start() - else: self.call(func, origin, phenny, input) - - for source in [origin.sender, origin.nick]: - try: self.stats[(func.name, source)] += 1 - except KeyError: - self.stats[(func.name, source)] = 1 - -if __name__ == '__main__': - print __doc__ +def decode(bytes): + try: text = bytes.decode('utf-8') + except UnicodeDecodeError: + try: text = bytes.decode('iso-8859-1') + except UnicodeDecodeError: + text = bytes.decode('cp1252') + return text + +class Phenny(irc.Bot): + def __init__(self, config): + args = (config.nick, config.name, config.channels, config.password) + irc.Bot.__init__(self, *args) + self.config = config + self.doc = {} + self.stats = {} + self.setup() + + def setup(self): + self.variables = {} + + filenames = [] + if not hasattr(self.config, 'enable'): + for fn in os.listdir(os.path.join(home, 'modules')): + if fn.endswith('.py') and not fn.startswith('_'): + filenames.append(os.path.join(home, 'modules', fn)) + else: + for fn in self.config.enable: + filenames.append(os.path.join(home, 'modules', fn + '.py')) + + if hasattr(self.config, 'extra'): + for fn in self.config.extra: + if os.path.isfile(fn): + filenames.append(fn) + elif os.path.isdir(fn): + for n in os.listdir(fn): + if n.endswith('.py') and not n.startswith('_'): + filenames.append(os.path.join(fn, n)) + + modules = [] + excluded_modules = getattr(self.config, 'exclude', []) + for filename in filenames: + name = os.path.basename(filename)[:-3] + if name in excluded_modules: continue + # if name in sys.modules: + # del sys.modules[name] + try: module = imp.load_source(name, filename) + except Exception, e: + print >> sys.stderr, "Error loading %s: %s (in bot.py)" % (name, e) + else: + if hasattr(module, 'setup'): + module.setup(self) + self.register(vars(module)) + modules.append(name) + + if modules: + print >> sys.stderr, 'Registered modules:', ', '.join(modules) + else: print >> sys.stderr, "Warning: Couldn't find any modules" + + self.bind_commands() + + def register(self, variables): + # This is used by reload.py, hence it being methodised + for name, obj in variables.iteritems(): + if hasattr(obj, 'commands') or hasattr(obj, 'rule'): + self.variables[name] = obj + + def bind_commands(self): + self.commands = {'high': {}, 'medium': {}, 'low': {}} + + def bind(self, priority, regexp, func): + print priority, regexp.pattern.encode('utf-8'), func + # register documentation + if not hasattr(func, 'name'): + func.name = func.__name__ + if func.__doc__: + if hasattr(func, 'example'): + example = func.example + example = example.replace('$nickname', self.nick) + else: example = None + self.doc[func.name] = (func.__doc__, example) + self.commands[priority].setdefault(regexp, []).append(func) + + def sub(pattern, self=self): + # These replacements have significant order + pattern = pattern.replace('$nickname', re.escape(self.nick)) + return pattern.replace('$nick', r'%s[,:] +' % re.escape(self.nick)) + + for name, func in self.variables.iteritems(): + # print name, func + if not hasattr(func, 'priority'): + func.priority = 'medium' + + if not hasattr(func, 'thread'): + func.thread = True + + if not hasattr(func, 'event'): + func.event = 'PRIVMSG' + else: func.event = func.event.upper() + + if hasattr(func, 'rule'): + if isinstance(func.rule, str): + pattern = sub(func.rule) + regexp = re.compile(pattern) + bind(self, func.priority, regexp, func) + + if isinstance(func.rule, tuple): + # 1) e.g. ('$nick', '(.*)') + if len(func.rule) == 2 and isinstance(func.rule[0], str): + prefix, pattern = func.rule + prefix = sub(prefix) + regexp = re.compile(prefix + pattern) + bind(self, func.priority, regexp, func) + + # 2) e.g. (['p', 'q'], '(.*)') + elif len(func.rule) == 2 and isinstance(func.rule[0], list): + prefix = self.config.prefix + commands, pattern = func.rule + for command in commands: + command = r'(%s)\b(?: +(?:%s))?' % (command, pattern) + regexp = re.compile(prefix + command) + bind(self, func.priority, regexp, func) + + # 3) e.g. ('$nick', ['p', 'q'], '(.*)') + elif len(func.rule) == 3: + prefix, commands, pattern = func.rule + prefix = sub(prefix) + for command in commands: + command = r'(%s) +' % command + regexp = re.compile(prefix + command + pattern) + bind(self, func.priority, regexp, func) + + if hasattr(func, 'commands'): + for command in func.commands: + template = r'^%s(%s)(?: +(.*))?$' + pattern = template % (self.config.prefix, command) + regexp = re.compile(pattern) + bind(self, func.priority, regexp, func) + + def wrapped(self, origin, text, match): + class PhennyWrapper(object): + def __init__(self, phenny): + self.bot = phenny + + def __getattr__(self, attr): + sender = origin.sender or text + if attr == 'reply': + return (lambda msg: + self.bot.msg(sender, origin.nick + ': ' + msg)) + elif attr == 'say': + return lambda msg: self.bot.msg(sender, msg) + return getattr(self.bot, attr) + + return PhennyWrapper(self) + + def input(self, origin, text, bytes, match, event, args): + class CommandInput(unicode): + def __new__(cls, text, origin, bytes, match, event, args): + s = unicode.__new__(cls, text) + s.sender = origin.sender + s.nick = origin.nick + s.event = event + s.bytes = bytes + s.match = match + s.group = match.group + s.groups = match.groups + s.args = args + s.admin = origin.nick in self.config.admins + s.owner = origin.nick == self.config.owner + return s + + return CommandInput(text, origin, bytes, match, event, args) + + def call(self, func, origin, phenny, input): + try: func(phenny, input) + except Exception, e: + self.error(origin) + + def limit(self, origin, func): + if origin.sender and origin.sender.startswith('#'): + if hasattr(self.config, 'limit'): + limits = self.config.limit.get(origin.sender) + if limits and (func.__module__ not in limits): + return True + return False + + def dispatch(self, origin, args): + bytes, event, args = args[0], args[1], args[2:] + text = decode(bytes) + + for priority in ('high', 'medium', 'low'): + items = self.commands[priority].items() + for regexp, funcs in items: + for func in funcs: + if event != func.event and func.event != '*': continue + + match = regexp.match(text) + if match: + if self.limit(origin, func): continue + + phenny = self.wrapped(origin, text, match) + input = self.input(origin, text, bytes, match, event, args) + + if func.thread: + targs = (func, origin, phenny, input) + t = threading.Thread(target=self.call, args=targs) + t.start() + else: self.call(func, origin, phenny, input) + + for source in [origin.sender, origin.nick]: + try: self.stats[(func.name, source)] += 1 + except KeyError: + self.stats[(func.name, source)] = 1 + +if __name__ == '__main__': + print __doc__ diff --git a/icao.py b/icao.py index 3ee121a..62bd0a1 100755 --- a/icao.py +++ b/icao.py @@ -7,4192 +7,4192 @@ http://inamidst.com/phenny/ """ data = ( - ("AYGA", -6.08166666667, 145.391666667), - ("AYMD", -5.20694444444, 145.788611111), - ("AYMH", -5.82611111111, 144.296111111), - ("AYNZ", -6.56972222222, 146.726111111), - ("AYPY", -9.44333333333, 147.22), - ("AYWK", -3.58361111111, 143.669166667), - ("BGBW", 61.1611111111, -45.4275), - ("BGCO", 70.7394444444, -22.6458333333), - ("BGGH", 64.1908333333, -51.6780555556), - ("BGJN", 69.2333333333, -51.0666666667), - ("BGKK", 65.5833333333, -37.15), - ("BGSF", 67.0169444444, -50.6891666667), - ("BGTL", 76.5311111111, -68.7030555556), - ("BIAR", 65.6597222222, -18.0725), - ("BIEG", 65.2833333333, -14.4013888889), - ("BIHN", 64.2955555556, -15.2272222222), - ("BIHU", 65.9522222222, -17.4258333333), - ("BIIS", 66.0580555556, -23.1352777778), - ("BIKF", 63.985, -22.6055555556), - ("BIKP", 66.3136111111, -16.4611111111), - ("BIPA", 65.5558333333, -23.965), - ("BIRK", 64.13, -21.9405555556), - ("BISI", 66.1333333333, -18.9166666667), - ("BIVM", 63.4241666667, -20.2786111111), - ("CYAM", 46.485, -84.5094444444), - ("CYAV", 50.0563888889, -97.0325), - ("CYAW", 44.6397222222, -63.4994444444), - ("CYAY", 51.3916666667, -56.0844444444), - ("CYAZ", 49.0822222222, -125.7725), - ("CYBB", 68.5344444444, -89.8080555556), - ("CYBC", 49.1322222222, -68.2072222222), - ("CYBG", 48.3305555556, -70.9963888889), - ("CYBK", 64.2988888889, -96.0777777778), - ("CYBL", 49.9508333333, -125.270833333), - ("CYBR", 49.91, -99.9519444444), - ("CYCB", 69.1080555556, -105.138333333), - ("CYCD", 49.0522222222, -123.87), - ("CYCG", 49.2963888889, -117.6325), - ("CYCH", 47.0077777778, -65.4491666667), - ("CYCL", 47.9905555556, -66.3313888889), - ("CYCO", 67.8166666667, -115.143888889), - ("CYCT", 52.075, -111.445277778), - ("CYCW", 49.1527777778, -121.938888889), - ("CYCY", 70.4861111111, -68.5166666667), - ("CYCZ", 50.3319444444, -115.873611111), - ("CYDA", 64.0430555556, -139.127777778), - ("CYDB", 61.3711111111, -139.040555556), - ("CYDC", 49.4675, -120.511944444), - ("CYDF", 49.2108333333, -57.3913888889), - ("CYDL", 58.4222222222, -130.032222222), - ("CYDN", 51.1008333333, -100.0525), - ("CYDQ", 55.7416666667, -120.181944444), - ("CYED", 53.6666666667, -113.466666667), - ("CYEG", 53.3097222222, -113.579722222), - ("CYEK", 61.0941666667, -94.0708333333), - ("CYEN", 49.2102777778, -102.965833333), - ("CYET", 53.5788888889, -116.465), - ("CYEU", 79.9947222222, -85.8133333333), - ("CYEV", 68.3041666667, -133.482777778), - ("CYFB", 63.7563888889, -68.5558333333), - ("CYFC", 45.8694444444, -66.5316666667), - ("CYFE", 48.7461111111, -69.0972222222), - ("CYFO", 54.6780555556, -101.681666667), - ("CYFR", 61.1808333333, -113.689722222), - ("CYFS", 61.7602777778, -121.236666667), - ("CYGK", 44.2252777778, -76.5969444444), - ("CYGL", 53.6252777778, -77.7041666667), - ("CYGP", 48.7752777778, -64.4786111111), - ("CYGQ", 49.7783333333, -86.9394444444), - ("CYGR", 47.4247222222, -61.7780555556), - ("CYGW", 55.2833333333, -77.7666666667), - ("CYGX", 56.35, -94.7), - ("CYHB", 52.8166666667, -102.311388889), - ("CYHD", 49.8316666667, -92.7441666667), - ("CYHI", 70.7630555556, -117.805833333), - ("CYHK", 68.6355555556, -95.8497222222), - ("CYHM", 43.1730555556, -79.935), - ("CYHU", 45.5175, -73.4169444444), - ("CYHY", 60.8397222222, -115.782777778), - ("CYHZ", 44.8808333333, -63.5086111111), - ("CYIB", 48.7738888889, -91.6386111111), - ("CYIO", 72.6833333333, -77.9666666667), - ("CYJN", 45.2944444444, -73.2811111111), - ("CYJT", 48.5441666667, -58.55), - ("CYKA", 50.7022222222, -120.441944444), - ("CYKF", 43.4588888889, -80.3844444444), - ("CYKL", 54.805, -66.8052777778), - ("CYKY", 51.5175, -109.180833333), - ("CYKZ", 43.8622222222, -79.37), - ("CYLD", 47.82, -83.3463888889), - ("CYLJ", 54.1252777778, -108.522777778), - ("CYLL", 53.3091666667, -110.0725), - ("CYLT", 82.5177777778, -62.2805555556), - ("CYLW", 49.9561111111, -119.377777778), - ("CYMA", 63.6166666667, -135.866666667), - ("CYMJ", 50.3302777778, -105.559166667), - ("CYMM", 56.6533333333, -111.221944444), - ("CYMO", 51.2911111111, -80.6077777778), - ("CYMW", 46.2744444444, -75.99), - ("CYMX", 45.6797222222, -74.0386111111), - ("CYNA", 50.1897222222, -61.7891666667), - ("CYND", 45.5213888889, -75.5641666667), - ("CYNM", 49.7616666667, -77.8027777778), - ("CYOC", 67.5705555556, -139.839166667), - ("CYOD", 54.405, -110.279444444), - ("CYOJ", 58.6213888889, -117.164722222), - ("CYOW", 45.3225, -75.6691666667), - ("CYPA", 53.2141666667, -105.672777778), - ("CYPE", 56.2269444444, -117.447222222), - ("CYPG", 49.9027777778, -98.2747222222), - ("CYPK", 49.2161111111, -122.71), - ("CYPL", 51.4463888889, -90.2141666667), - ("CYPN", 49.8363888889, -64.2886111111), - ("CYPQ", 44.23, -78.3633333333), - ("CYPR", 54.2861111111, -130.444722222), - ("CYPY", 58.7672222222, -111.117222222), - ("CYQA", 44.9747222222, -79.3033333333), - ("CYQB", 46.7883333333, -71.3975), - ("CYQF", 52.1786111111, -113.893055556), - ("CYQG", 42.2755555556, -82.9555555556), - ("CYQH", 60.1177777778, -128.821944444), - ("CYQK", 49.7883333333, -94.3630555556), - ("CYQL", 49.6302777778, -112.799722222), - ("CYQM", 46.1122222222, -64.6786111111), - ("CYQN", 50.1827777778, -86.6963888889), - ("CYQQ", 49.7108333333, -124.886666667), - ("CYQR", 50.4319444444, -104.665833333), - ("CYQT", 48.3719444444, -89.3238888889), - ("CYQU", 55.1797222222, -118.885), - ("CYQV", 51.2647222222, -102.461666667), - ("CYQW", 52.7691666667, -108.243611111), - ("CYQX", 48.9369444444, -54.5680555556), - ("CYQY", 46.1613888889, -60.0477777778), - ("CYQZ", 53.0261111111, -122.51), - ("CYRB", 74.7169444444, -94.9694444444), - ("CYRI", 47.7644444444, -69.5847222222), - ("CYRJ", 48.52, -72.2655555556), - ("CYRM", 52.4297222222, -114.904166667), - ("CYRT", 62.8113888889, -92.1158333333), - ("CYSB", 46.625, -80.7988888889), - ("CYSC", 45.4380555556, -71.6905555556), - ("CYSJ", 45.3161111111, -65.8902777778), - ("CYSM", 60.0222222222, -111.960277778), - ("CYSR", 72.9822222222, -84.6136111111), - ("CYSU", 46.4427777778, -63.8311111111), - ("CYSY", 71.9938888889, -125.2425), - ("CYTE", 64.23, -76.5266666667), - ("CYTH", 55.8011111111, -97.8641666667), - ("CYTR", 44.1188888889, -77.5280555556), - ("CYTS", 48.5697222222, -81.3766666667), - ("CYTZ", 43.6275, -79.3961111111), - ("CYUB", 69.4333333333, -133.026388889), - ("CYUL", 45.4680555556, -73.7413888889), - ("CYUT", 66.5213888889, -86.2247222222), - ("CYUX", 68.7761111111, -81.2436111111), - ("CYUY", 48.2061111111, -78.8355555556), - ("CYVC", 55.1513888889, -105.261944444), - ("CYVG", 53.3558333333, -110.823888889), - ("CYVM", 67.5458333333, -64.0313888889), - ("CYVO", 48.0533333333, -77.7827777778), - ("CYVP", 58.0961111111, -68.4269444444), - ("CYVQ", 65.2825, -126.800277778), - ("CYVR", 49.195, -123.181944444), - ("CYVT", 55.8419444444, -108.4175), - ("CYVV", 44.7458333333, -81.1072222222), - ("CYWA", 45.9522222222, -77.3191666667), - ("CYWG", 49.91, -97.2344444444), - ("CYWK", 52.9219444444, -66.8644444444), - ("CYWL", 52.1830555556, -122.054166667), - ("CYWY", 63.2094444444, -123.436666667), - ("CYXC", 49.6102777778, -115.7825), - ("CYXD", 53.5725, -113.520555556), - ("CYXE", 52.1708333333, -106.699722222), - ("CYXH", 50.0188888889, -110.720833333), - ("CYXJ", 56.2380555556, -120.740277778), - ("CYXL", 50.1144444444, -91.9041666667), - ("CYXP", 66.145, -65.7136111111), - ("CYXR", 47.695, -79.8488888889), - ("CYXS", 53.8894444444, -122.678888889), - ("CYXT", 54.4663888889, -128.5775), - ("CYXU", 43.0355555556, -81.1538888889), - ("CYXX", 49.0252777778, -122.363333333), - ("CYXY", 60.7094444444, -135.068333333), - ("CYYB", 46.3636111111, -79.4227777778), - ("CYYC", 51.1138888889, -114.020277778), - ("CYYD", 54.8247222222, -127.182777778), - ("CYYE", 58.8363888889, -122.596944444), - ("CYYF", 49.4627777778, -119.602222222), - ("CYYG", 46.29, -63.1211111111), - ("CYYH", 69.5466666667, -93.5766666667), - ("CYYJ", 48.6469444444, -123.425833333), - ("CYYL", 56.8638888889, -101.076111111), - ("CYYN", 50.2919444444, -107.690555556), - ("CYYQ", 58.7391666667, -94.065), - ("CYYR", 53.3191666667, -60.4258333333), - ("CYYT", 47.6186111111, -52.7519444444), - ("CYYU", 49.4138888889, -82.4675), - ("CYYW", 50.2902777778, -88.9097222222), - ("CYYY", 48.6086111111, -68.2080555556), - ("CYYZ", 43.6772222222, -79.6305555556), - ("CYZD", 43.7425, -79.4655555556), - ("CYZE", 45.8852777778, -82.5677777778), - ("CYZF", 62.4627777778, -114.440277778), - ("CYZH", 55.2933333333, -114.778333333), - ("CYZP", 53.2541666667, -131.813888889), - ("CYZR", 42.9994444444, -82.3088888889), - ("CYZT", 50.6805555556, -127.366666667), - ("CYZU", 54.1438888889, -115.786666667), - ("CYZV", 50.2233333333, -66.2655555556), - ("CYZW", 60.1727777778, -132.742777778), - ("CYZX", 44.9844444444, -64.9169444444), - ("CZFA", 62.2075, -133.375833333), - ("CZFM", 67.4077777778, -134.860277778), - ("DAAB", 36.5036111111, 2.81416666667), - ("DAAD", 35.3325, 4.20638888889), - ("DAAE", 36.7119444444, 5.06972222222), - ("DAAG", 36.6908333333, 3.21527777778), - ("DAAJ", 24.2925, 9.45222222222), - ("DAAK", 36.5458333333, 2.87611111111), - ("DAAM", 36.1086111111, 6.36444444444), - ("DAAN", 26.71, 0.285555555556), - ("DAAP", 26.5733333333, 8.48361111111), - ("DAAQ", 35.5252777778, 2.87861111111), - ("DAAS", 36.1780555556, 5.32444444444), - ("DAAT", 22.8108333333, 5.45083333333), - ("DAAV", 36.795, 5.87333333333), - ("DAAY", 33.5358333333, -0.242222222222), - ("DAAZ", 35.7522222222, 0.626111111111), - ("DABB", 36.8222222222, 7.80916666667), - ("DABC", 36.2766666667, 6.62388888889), - ("DABS", 35.4313888889, 8.12055555556), - ("DAFH", 32.9297222222, 3.31222222222), - ("DAOB", 35.3411111111, 1.46305555556), - ("DAOE", 35.7352777778, -0.805277777778), - ("DAOF", 27.7002777778, -8.16694444444), - ("DAOI", 36.2125, 1.33166666667), - ("DAOL", 35.5422222222, -0.532222222222), - ("DAON", 35.0166666667, -1.45), - ("DAOO", 35.6236111111, -0.621111111111), - ("DAOS", 35.1716666667, -0.593055555556), - ("DAOV", 35.2075, 0.146944444444), - ("DAUA", 27.8375, -0.186388888889), - ("DAUB", 34.7930555556, 5.73805555556), - ("DAUE", 30.5711111111, 2.85944444444), - ("DAUG", 32.3838888889, 3.79388888889), - ("DAUH", 31.6727777778, 6.14027777778), - ("DAUI", 27.2508333333, 2.51194444444), - ("DAUK", 33.0677777778, 6.08861111111), - ("DAUL", 33.7638888889, 2.92722222222), - ("DAUT", 29.2369444444, 0.275833333333), - ("DAUU", 31.9172222222, 5.41277777778), - ("DAUZ", 28.0513888889, 9.64277777778), - ("DBBB", 6.35722222222, 2.38416666667), - ("DBBP", 9.35694444444, 2.60888888889), - ("DFFD", 12.3530555556, -1.51222222222), - ("DFOO", 11.16, -4.33083333333), - ("DGAA", 5.60277777778, -0.168055555556), - ("DGLE", 9.56333333333, -0.863333333333), - ("DGLW", 10.0825, -2.5075), - ("DGSN", 7.36166666667, -2.32861111111), - ("DGTK", 4.89333333333, -1.775), - ("DIAP", 5.25972222222, -3.92638888889), - ("DIBK", 7.73861111111, -5.07361111111), - ("DIDL", 6.7925, -6.47305555556), - ("DIKO", 9.38694444444, -5.55638888889), - ("DIMN", 7.27194444444, -7.58694444444), - ("DISP", 4.74666666667, -6.66055555556), - ("DIYO", 6.90305555556, -5.36583333333), - ("DNAA", 9.00666666667, 7.26305555556), - ("DNAK", 7.24666666667, 5.30083333333), - ("DNBE", 6.31722222222, 5.59944444444), - ("DNCA", 4.97583333333, 8.34694444444), - ("DNEN", 6.47416666667, 7.56194444444), - ("DNGU", 12.1716666667, 6.69611111111), - ("DNIB", 7.36222222222, 3.97833333333), - ("DNIL", 8.44, 4.49388888889), - ("DNJO", 9.63972222222, 8.86888888889), - ("DNKA", 10.6958333333, 7.32), - ("DNKN", 12.0475, 8.52444444444), - ("DNMA", 11.8552777778, 13.0808333333), - ("DNMK", 7.70361111111, 8.61388888889), - ("DNMM", 6.57722222222, 3.32111111111), - ("DNMN", 9.65194444444, 6.46222222222), - ("DNPO", 5.01527777778, 6.94944444444), - ("DNSO", 12.9161111111, 5.20694444444), - ("DNYO", 9.26027777778, 12.4297222222), - ("DNZA", 11.13, 7.68555555556), - ("DRRM", 13.5025, 7.12666666667), - ("DRRN", 13.4813888889, 2.18361111111), - ("DRRT", 14.8755555556, 5.26527777778), - ("DRZA", 16.9647222222, 7.99694444444), - ("DRZD", 18.9686111111, 12.8686111111), - ("DRZF", 13.3727777778, 12.6266666667), - ("DRZR", 13.7788888889, 8.98361111111), - ("DRZT", 14.9994444444, 8.76694444444), - ("DTMB", 35.7580555556, 10.7547222222), - ("DTTA", 36.8508333333, 10.2269444444), - ("DTTB", 37.2452777778, 9.79138888889), - ("DTTD", 32.3061111111, 10.3819444444), - ("DTTF", 34.4219444444, 8.8225), - ("DTTG", 33.8766666667, 10.1033333333), - ("DTTI", 36.7211111111, 9.94305555556), - ("DTTJ", 33.875, 10.7752777778), - ("DTTR", 31.7041666667, 9.25444444444), - ("DTTX", 34.7177777778, 10.6908333333), - ("DTTZ", 33.9397222222, 8.11055555556), - ("DXNG", 9.76722222222, 1.09111111111), - ("DXXX", 6.16555555556, 1.25388888889), - ("EBAW", 51.19, 4.46277777778), - ("EBBE", 50.7586111111, 4.76833333333), - ("EBBL", 51.1677777778, 5.47083333333), - ("EBBR", 50.9022222222, 4.49861111111), - ("EBBT", 51.3333333333, 4.5), - ("EBBX", 49.8872222222, 5.22861111111), - ("EBCI", 50.4591666667, 4.45361111111), - ("EBCV", 50.5758333333, 3.83083333333), - ("EBFN", 51.09, 2.65277777778), - ("EBFS", 50.2436111111, 4.64861111111), - ("EBKT", 50.8177777778, 3.20833333333), - ("EBLG", 50.6372222222, 5.44305555556), - ("EBOS", 51.1988888889, 2.86222222222), - ("EBSL", 50.9483333333, 5.59166666667), - ("EBST", 50.7883333333, 5.19277777778), - ("EBUL", 51.1438888889, 3.47416666667), - ("EBWE", 51.395, 4.96055555556), - ("EBZR", 51.2655555556, 4.75472222222), - ("EDAB", 51.1933333333, 14.5197222222), - ("EDAC", 50.9816666667, 12.5061111111), - ("EDAD", 51.8319444444, 12.1858333333), - ("EDAE", 52.1972222222, 14.5855555556), - ("EDAH", 53.8786111111, 14.1522222222), - ("EDAK", 51.3080555556, 13.5547222222), - ("EDAM", 51.3627777778, 11.9408333333), - ("EDAQ", 51.5519444444, 12.0525), - ("EDAU", 51.2944444444, 13.3588888889), - ("EDAX", 53.3063888889, 12.7530555556), - ("EDAY", 52.5797222222, 13.9155555556), - ("EDAZ", 52.2033333333, 13.1586111111), - ("EDBC", 51.8558333333, 11.4180555556), - ("EDBG", 35.4605555556, -77.9647222222), - ("EDBH", 54.3380555556, 12.71), - ("EDBJ", 50.9172222222, 11.7136111111), - ("EDBK", 52.9186111111, 12.4252777778), - ("EDBM", 52.0736111111, 11.6263888889), - ("EDBN", 51.3280555556, 12.6566666667), - ("EDBR", 51.3644444444, 14.9519444444), - ("EDCA", 53.8325, 13.6688888889), - ("EDCD", 51.8894444444, 14.5316666667), - ("EDCK", 51.7211111111, 11.9616666667), - ("EDCM", 51.2961111111, 14.1288888889), - ("EDDB", 52.38, 13.5225), - ("EDDC", 51.1325, 13.7669444444), - ("EDDE", 50.98, 10.9580555556), - ("EDDF", 50.0263888889, 8.54305555556), - ("EDDG", 52.1344444444, 7.68472222222), - ("EDDH", 53.6302777778, 9.98805555556), - ("EDDI", 52.4727777778, 13.4038888889), - ("EDDK", 50.8658333333, 7.1425), - ("EDDL", 51.2894444444, 6.76666666667), - ("EDDM", 48.3536111111, 11.7858333333), - ("EDDN", 49.4986111111, 11.0780555556), - ("EDDP", 51.4238888889, 12.2361111111), - ("EDDR", 49.2144444444, 7.10944444444), - ("EDDS", 48.6897222222, 9.22194444444), - ("EDDT", 52.5594444444, 13.2875), - ("EDDV", 52.4608333333, 9.685), - ("EDDW", 53.0475, 8.78666666667), - ("EDFE", 49.9608333333, 8.64361111111), - ("EDFH", 49.9497222222, 7.26388888889), - ("EDFM", 49.4725, 8.51361111111), - ("EDFQ", 51.0352777778, 8.67888888889), - ("EDFV", 49.6063888889, 8.36833333333), - ("EDFZ", 49.9688888889, 8.1475), - ("EDGE", 50.9927777778, 10.4725), - ("EDGS", 50.7075, 8.08194444444), - ("EDHI", 53.5352777778, 9.83527777778), - ("EDHK", 54.3794444444, 10.145), - ("EDHL", 53.8052777778, 10.7191666667), - ("EDKA", 50.8227777778, 6.18722222222), - ("EDKV", 50.4058333333, 6.52805555556), - ("EDKZ", 51.0994444444, 7.60194444444), - ("EDLA", 51.4833333333, 7.89916666667), - ("EDLC", 51.5302777778, 6.53694444444), - ("EDLE", 51.4013888889, 6.93583333333), - ("EDLN", 51.2302777778, 6.50444444444), - ("EDLP", 51.6141666667, 8.61611111111), - ("EDLS", 51.9958333333, 6.84027777778), - ("EDLW", 51.5180555556, 7.61222222222), - ("EDMA", 48.425, 10.9316666667), - ("EDMB", 48.1108333333, 9.76277777778), - ("EDME", 48.3961111111, 12.7236111111), - ("EDMO", 48.0813888889, 11.2833333333), - ("EDMS", 48.9008333333, 12.5180555556), - ("EDMV", 48.6363888889, 13.1952777778), - ("EDNL", 47.8588888889, 10.0144444444), - ("EDNY", 47.6711111111, 9.51138888889), - ("EDOP", 53.4269444444, 11.7833333333), - ("EDOV", 52.6288888889, 11.8197222222), - ("EDPA", 48.7777777778, 10.2644444444), - ("EDQC", 50.2625, 10.9958333333), - ("EDQD", 49.9841666667, 11.6383333333), - ("EDQE", 49.7941666667, 11.1322222222), - ("EDQM", 50.2886111111, 11.8547222222), - ("EDQP", 49.8627777778, 11.7877777778), - ("EDQT", 50.0177777778, 10.5294444444), - ("EDRK", 50.3247222222, 7.53083333333), - ("EDRT", 49.8633333333, 6.78888888889), - ("EDRY", 49.3025, 8.45111111111), - ("EDRZ", 49.2094444444, 7.40055555556), - ("EDTB", 48.7911111111, 8.18694444444), - ("EDTD", 47.9730555556, 8.52222222222), - ("EDTF", 48.0202777778, 7.83361111111), - ("EDTK", 48.9822222222, 8.33333333333), - ("EDTM", 48.0536111111, 9.37277777778), - ("EDTY", 49.1180555556, 9.77722222222), - ("EDUS", 51.6075, 13.7377777778), - ("EDVE", 52.3191666667, 10.5561111111), - ("EDVK", 51.4083333333, 9.3775), - ("EDVM", 52.1775, 9.94555555556), - ("EDWB", 53.5033333333, 8.57333333333), - ("EDWD", 53.1430555556, 8.62333333333), - ("EDWE", 53.3911111111, 7.22722222222), - ("EDWF", 53.2719444444, 7.44277777778), - ("EDWI", 53.5047222222, 8.05333333333), - ("EDWR", 53.5952777778, 6.70916666667), - ("EDWY", 53.7066666667, 7.23), - ("EDXF", 54.7716666667, 9.37805555556), - ("EDXR", 54.2208333333, 9.60055555556), - ("EDXW", 54.9130555556, 8.34027777778), - ("EEEI", 59.2594444444, 24.2044444444), - ("EEKA", 58.9905555556, 22.8305555556), - ("EEKE", 58.2297222222, 22.5094444444), - ("EEPU", 58.4188888889, 24.4727777778), - ("EETN", 59.4130555556, 24.8327777778), - ("EETU", 58.3072222222, 26.6902777778), - ("EFET", 68.3625, 23.4241666667), - ("EFEU", 61.1161111111, 22.2013888889), - ("EFHA", 61.8558333333, 24.7863888889), - ("EFHF", 60.2544444444, 25.0427777778), - ("EFHK", 60.32, 24.9561111111), - ("EFHM", 61.6894444444, 23.0736111111), - ("EFHN", 59.8486111111, 23.0833333333), - ("EFHV", 60.6544444444, 24.8811111111), - ("EFIK", 60.4625, 23.6525), - ("EFIM", 61.2491666667, 28.9036111111), - ("EFIT", 62.1661111111, 30.0736111111), - ("EFIV", 68.6072222222, 27.4052777778), - ("EFJO", 62.6588888889, 29.6244444444), - ("EFJY", 62.3994444444, 25.6780555556), - ("EFKA", 63.1269444444, 23.0513888889), - ("EFKE", 65.7816666667, 24.5988888889), - ("EFKI", 64.2852777778, 27.6922222222), - ("EFKJ", 62.4625, 22.3930555556), - ("EFKK", 63.7211111111, 23.1430555556), - ("EFKM", 66.7127777778, 27.1566666667), - ("EFKS", 65.9875, 29.2391666667), - ("EFKT", 67.7008333333, 24.8466666667), - ("EFKU", 63.0069444444, 27.7975), - ("EFLA", 61.1438888889, 25.6933333333), - ("EFLP", 61.0444444444, 28.1441666667), - ("EFMA", 60.1219444444, 19.8980555556), - ("EFME", 62.9466666667, 23.5188888889), - ("EFMI", 61.6863888889, 27.2016666667), - ("EFNU", 60.3338888889, 24.2963888889), - ("EFOU", 64.93, 25.3544444444), - ("EFPI", 61.2455555556, 22.1933333333), - ("EFPO", 61.4616666667, 21.7997222222), - ("EFPU", 65.4022222222, 26.9469444444), - ("EFPY", 63.7316666667, 25.9261111111), - ("EFRH", 64.6880555556, 24.6958333333), - ("EFRN", 62.0652777778, 28.3563888889), - ("EFRO", 66.5647222222, 25.8302777778), - ("EFRY", 60.7447222222, 24.1077777778), - ("EFSA", 61.9430555556, 28.945), - ("EFSE", 61.0622222222, 26.7986111111), - ("EFSO", 67.395, 26.6188888889), - ("EFTP", 61.4138888889, 23.6041666667), - ("EFTS", 61.7733333333, 24.0269444444), - ("EFTU", 60.5138888889, 22.2627777778), - ("EFUT", 60.8963888889, 26.9383333333), - ("EFVA", 63.0511111111, 21.7613888889), - ("EFVR", 62.1711111111, 27.8686111111), - ("EFYL", 64.0602777778, 24.7158333333), - ("EGAA", 54.6575, -6.21583333333), - ("EGAB", 54.3988888889, -7.65166666667), - ("EGAC", 54.6180555556, -5.8725), - ("EGAE", 55.0427777778, -7.16111111111), - ("EGBB", 52.4536111111, -1.74777777778), - ("EGBE", 52.3697222222, -1.47972222222), - ("EGBG", 52.6077777778, -1.03194444444), - ("EGBJ", 51.8941666667, -2.16722222222), - ("EGBN", 52.92, -1.07916666667), - ("EGBO", 52.5175, -2.25972222222), - ("EGBP", 51.6680555556, -2.05694444444), - ("EGBT", 52.0408333333, -1.09555555556), - ("EGCC", 53.3536111111, -2.27472222222), - ("EGCD", 53.3380555556, -2.14888888889), - ("EGCF", 53.5597222222, -0.858333333333), - ("EGDC", 51.0869444444, -4.15027777778), - ("EGDG", 50.4405555556, -4.99527777778), - ("EGDL", 51.505, -1.99333333333), - ("EGDM", 51.1519444444, -1.74722222222), - ("EGDR", 50.0858333333, -5.25555555556), - ("EGDX", 51.4047222222, -3.43555555556), - ("EGDY", 51.0091666667, -2.63861111111), - ("EGFE", 51.8330555556, -4.96111111111), - ("EGFF", 51.3966666667, -3.34333333333), - ("EGFH", 51.6052777778, -4.06777777778), - ("EGGD", 51.3825, -2.71888888889), - ("EGGP", 53.3336111111, -2.84972222222), - ("EGGW", 51.8744444444, -0.368333333333), - ("EGHD", 50.4227777778, -4.10583333333), - ("EGHH", 50.78, -1.8425), - ("EGHI", 50.95, -1.35666666667), - ("EGHL", 51.185, -1.03222222222), - ("EGJB", 49.4347222222, -2.60194444444), - ("EGJJ", 49.2077777778, -2.19527777778), - ("EGKA", 50.8355555556, -0.297222222222), - ("EGKB", 51.3308333333, 0.0325), - ("EGKK", 51.1480555556, -0.190277777778), - ("EGLC", 51.505, 0.0541666666667), - ("EGLF", 51.2758333333, -0.776111111111), - ("EGLJ", 51.6761111111, -1.08083333333), - ("EGLK", 51.3238888889, -0.8475), - ("EGLL", 51.4775, -0.461388888889), - ("EGMC", 51.5713888889, 0.695555555556), - ("EGMD", 50.9561111111, 0.939166666667), - ("EGMH", 51.3422222222, 1.34611111111), - ("EGNB", 53.7194444444, -0.566111111111), - ("EGNC", 54.9375, -2.80916666667), - ("EGNH", 53.7716666667, -3.02861111111), - ("EGNJ", 53.5744444444, -0.350833333333), - ("EGNL", 54.1297222222, -3.25611111111), - ("EGNM", 53.8658333333, -1.66055555556), - ("EGNO", 53.745, -2.88305555556), - ("EGNR", 53.1780555556, -2.97777777778), - ("EGNS", 54.0833333333, -4.62388888889), - ("EGNT", 55.0375, -1.69166666667), - ("EGNV", 54.5091666667, -1.42916666667), - ("EGNX", 52.8311111111, -1.32805555556), - ("EGOD", 52.8116666667, -4.12333333333), - ("EGOE", 52.8711111111, -2.53333333333), - ("EGOQ", 53.2583333333, -4.37333333333), - ("EGOS", 52.7980555556, -2.66777777778), - ("EGOV", 53.2480555556, -4.53527777778), - ("EGOW", 53.5813888889, -3.05527777778), - ("EGOY", 54.8511111111, -4.94777777778), - ("EGPA", 58.9580555556, -2.905), - ("EGPB", 59.8788888889, -1.29555555556), - ("EGPC", 58.4586111111, -3.09277777778), - ("EGPD", 57.2041666667, -2.20027777778), - ("EGPE", 57.54, -4.05), - ("EGPF", 55.8719444444, -4.43305555556), - ("EGPH", 55.95, -3.3725), - ("EGPI", 55.6819444444, -6.25666666667), - ("EGPK", 55.5077777778, -4.58666666667), - ("EGPL", 57.4811111111, -7.36277777778), - ("EGPM", 60.4322222222, -1.29805555556), - ("EGPN", 56.4525, -3.02583333333), - ("EGPO", 58.2136111111, -6.32888888889), - ("EGPU", 56.4991666667, -6.86916666667), - ("EGQL", 56.3727777778, -2.86833333333), - ("EGQS", 57.705, -3.33916666667), - ("EGRR", 51.3833333333, -0.783333333333), - ("EGSC", 52.205, 0.175), - ("EGSF", 52.4680555556, -0.251111111111), - ("EGSH", 52.6758333333, 1.28277777778), - ("EGSS", 51.885, 0.235), - ("EGSX", 51.7216666667, 0.154166666667), - ("EGSY", 53.3941666667, -1.38833333333), - ("EGTC", 52.0722222222, -0.616666666667), - ("EGTD", 51.1166666667, -0.534444444444), - ("EGTE", 50.7344444444, -3.41388888889), - ("EGTG", 51.5194444444, -2.59083333333), - ("EGTH", 51.7666666667, 0.25), - ("EGTK", 51.8369444444, -1.32), - ("EGUB", 51.6161111111, -1.09555555556), - ("EGUL", 52.4091666667, 0.560833333333), - ("EGUN", 52.3608333333, 0.488333333333), - ("EGUW", 52.1272222222, 0.955833333333), - ("EGUY", 52.3572222222, -0.107777777778), - ("EGVA", 51.6819444444, -1.79), - ("EGVN", 51.7497222222, -1.58361111111), - ("EGVO", 51.2341666667, -0.942777777778), - ("EGWC", 52.64, -2.30555555556), - ("EGWU", 51.5527777778, -0.418055555556), - ("EGXC", 53.0927777778, -0.165833333333), - ("EGXD", 54.1369444444, -1.42), - ("EGXE", 54.2922222222, -1.535), - ("EGXG", 53.8341666667, -1.19527777778), - ("EGXH", 52.3425, 0.772777777778), - ("EGXJ", 52.7355555556, -0.648611111111), - ("EGXP", 53.3075, -0.550833333333), - ("EGXT", 52.6125, -0.476388888889), - ("EGXU", 54.0494444444, -1.25194444444), - ("EGXW", 53.1661111111, -0.523611111111), - ("EGXZ", 54.2055555556, -1.38222222222), - ("EGYC", 52.7547222222, 1.35722222222), - ("EGYD", 53.0305555556, -0.481111111111), - ("EGYE", 52.9622222222, -0.561388888889), - ("EGYM", 52.6483333333, 0.550277777778), - ("EGYP", -51.8227777778, -58.4472222222), - ("EHAM", 52.3086111111, 4.76388888889), - ("EHBD", 51.2552777778, 5.60138888889), - ("EHBK", 50.9113888889, 5.77), - ("EHDL", 52.0605555556, 5.87305555556), - ("EHDR", 53.1191666667, 6.12972222222), - ("EHEH", 51.45, 5.37444444444), - ("EHGG", 53.1194444444, 6.57944444444), - ("EHGR", 51.5677777778, 4.93305555556), - ("EHKD", 52.9233333333, 4.78055555556), - ("EHLE", 52.4602777778, 5.52722222222), - ("EHLW", 53.2286111111, 5.76055555556), - ("EHRD", 51.9572222222, 4.44166666667), - ("EHSB", 52.1269444444, 5.27638888889), - ("EHTW", 52.27, 6.87416666667), - ("EHVB", 52.1697222222, 4.42611111111), - ("EHWO", 51.4488888889, 4.34194444444), - ("EICK", 51.8427777778, -8.49194444444), - ("EICM", 53.3013888889, -8.93916666667), - ("EIDL", 55.0441666667, -8.34083333333), - ("EIDW", 53.4211111111, -6.27), - ("EIKN", 53.9102777778, -8.81833333333), - ("EIKY", 52.1808333333, -9.52361111111), - ("EIME", 53.3027777778, -6.44277777778), - ("EINN", 52.7019444444, -8.92472222222), - ("EISG", 54.28, -8.59916666667), - ("EIWF", 52.1869444444, -7.08694444444), - ("EKAH", 56.3041666667, 10.6194444444), - ("EKBI", 55.7402777778, 9.15166666667), - ("EKCH", 55.6177777778, 12.6558333333), - ("EKEB", 55.5258333333, 8.55333333333), - ("EKGH", 55.9411111111, 12.3822222222), - ("EKHO", 56.3966666667, 8.44333333333), - ("EKKA", 56.2972222222, 9.12444444444), - ("EKLS", 57.2777777778, 11.0013888889), - ("EKMB", 54.6991666667, 11.44), - ("EKOD", 55.4761111111, 10.3291666667), - ("EKPB", 54.8702777778, 9.27916666667), - ("EKRK", 55.5855555556, 12.1313888889), - ("EKRN", 55.0630555556, 14.7594444444), - ("EKSB", 54.9641666667, 9.79166666667), - ("EKSN", 57.5033333333, 10.2291666667), - ("EKSP", 55.2252777778, 9.26388888889), - ("EKSV", 56.55, 9.17277777778), - ("EKTS", 57.0686111111, 8.705), - ("EKVA", 55.6969444444, 9.19333333333), - ("EKVD", 55.4361111111, 9.33083333333), - ("EKVG", 62.0636111111, -7.27694444444), - ("EKVH", 56.8469444444, 9.45861111111), - ("EKVJ", 55.99, 8.35388888889), - ("EKVL", 55.7672222222, 12.3433333333), - ("EKYT", 57.0927777778, 9.84888888889), - ("ELLX", 49.6263888889, 6.21138888889), - ("ENAL", 62.5602777778, 6.11), - ("ENAN", 69.2925, 16.1441666667), - ("ENAT", 69.9769444444, 23.3661111111), - ("ENBL", 61.3925, 5.76416666667), - ("ENBM", 60.6386111111, 6.50138888889), - ("ENBN", 65.4591666667, 12.2136111111), - ("ENBO", 67.2688888889, 14.3633333333), - ("ENBR", 60.2933333333, 5.21805555556), - ("ENBS", 70.6, 29.6925), - ("ENCN", 58.2041666667, 8.08527777778), - ("ENDI", 60.4166666667, 8.51388888889), - ("ENDU", 69.0555555556, 18.5402777778), - ("ENEV", 68.4911111111, 16.6780555556), - ("ENFB", 59.8955555556, 10.6169444444), - ("ENFG", 61.0111111111, 9.29305555556), - ("ENFL", 61.5838888889, 5.025), - ("ENGM", 60.1938888889, 11.1002777778), - ("ENHA", 60.8183333333, 11.0672222222), - ("ENHD", 59.345, 5.20833333333), - ("ENHK", 70.4866666667, 22.1397222222), - ("ENKB", 63.1116666667, 7.82444444444), - ("ENKJ", 59.9691666667, 11.0358333333), - ("ENKR", 69.725, 29.8875), - ("ENLI", 58.1002777778, 6.625), - ("ENML", 62.7461111111, 7.2725), - ("ENMS", 65.7838888889, 13.2147222222), - ("ENNA", 70.0686111111, 24.9733333333), - ("ENNO", 59.5655555556, 9.21166666667), - ("ENOL", 63.6988888889, 9.60388888889), - ("ENRO", 62.5783333333, 11.3422222222), - ("ENRY", 59.3788888889, 10.7855555556), - ("ENSB", 78.2461111111, 15.4655555556), - ("ENSG", 61.1561111111, 7.13638888889), - ("ENSN", 59.185, 9.56694444444), - ("ENSO", 59.7916666667, 5.34083333333), - ("ENSR", 69.7869444444, 20.9594444444), - ("ENSS", 70.3552777778, 31.0447222222), - ("ENST", 65.9566666667, 12.4688888889), - ("ENTC", 69.6833333333, 18.9188888889), - ("ENTO", 59.1866666667, 10.2586111111), - ("ENVA", 63.4575, 10.9397222222), - ("ENZV", 58.8766666667, 5.63777777778), - ("EPGD", 54.3775, 18.4661111111), - ("EPKK", 50.0775, 19.7847222222), - ("EPKM", 50.2383333333, 19.035), - ("EPKO", 54.0422222222, 16.2636111111), - ("EPKT", 50.4741666667, 19.08), - ("EPLL", 51.7219444444, 19.3980555556), - ("EPML", 50.3222222222, 21.4619444444), - ("EPPO", 52.4211111111, 16.8263888889), - ("EPRZ", 50.11, 22.0188888889), - ("EPSC", 53.5847222222, 14.9019444444), - ("EPSD", 53.3919444444, 14.6336111111), - ("EPSK", 54.4788888889, 17.1075), - ("EPSN", 53.7905555556, 15.8280555556), - ("EPWA", 52.1655555556, 20.9669444444), - ("EPWR", 51.1025, 16.8858333333), - ("EPZG", 52.1386111111, 15.7986111111), - ("ESCF", 58.4022222222, 15.5255555556), - ("ESCK", 58.6108333333, 16.1033333333), - ("ESCM", 59.8972222222, 17.5883333333), - ("ESCN", 59.1808333333, 17.9122222222), - ("ESDB", 56.2958333333, 12.8469444444), - ("ESDF", 56.2666666667, 15.265), - ("ESFH", 58.4091666667, 13.2625), - ("ESFI", 56.1836111111, 14.1322222222), - ("ESFM", 58.5980555556, 14.1136111111), - ("ESFQ", 56.8441666667, 15.4525), - ("ESFR", 58.4980555556, 13.0530555556), - ("ESFY", 56.785, 13.6016666667), - ("ESGG", 57.6627777778, 12.2797222222), - ("ESGJ", 57.7575, 14.0686111111), - ("ESGK", 58.1697222222, 13.5877777778), - ("ESGL", 58.4652777778, 13.1741666667), - ("ESGP", 57.7747222222, 11.8702777778), - ("ESGR", 58.4563888889, 13.9725), - ("ESGT", 58.3180555556, 12.345), - ("ESIA", 58.5136111111, 14.5069444444), - ("ESIB", 58.4263888889, 12.7141666667), - ("ESKA", 60.1327777778, 18.105), - ("ESKB", 59.4186111111, 17.8905555556), - ("ESKK", 59.3458333333, 14.4958333333), - ("ESKM", 60.9577777778, 14.5111111111), - ("ESKN", 58.7886111111, 16.9119444444), - ("ESKS", 59.3138888889, 17.1091666667), - ("ESKV", 59.6758333333, 12.6391666667), - ("ESKX", 58.7908333333, 16.5708333333), - ("ESMA", 56.6105555556, 15.6047222222), - ("ESMG", 56.9502777778, 13.9216666667), - ("ESMK", 55.9216666667, 14.0852777778), - ("ESML", 55.9447222222, 12.8608333333), - ("ESMO", 57.3502777778, 16.4977777778), - ("ESMP", 57.2641666667, 13.5991666667), - ("ESMQ", 56.6852777778, 16.2875), - ("ESMS", 55.53, 13.3713888889), - ("ESMT", 56.6911111111, 12.82), - ("ESMV", 57.2922222222, 14.1372222222), - ("ESMX", 56.9288888889, 14.7277777778), - ("ESNA", 63.7383333333, 15.4583333333), - ("ESNC", 62.4088888889, 13.7472222222), - ("ESND", 62.0477777778, 14.4227777778), - ("ESNF", 61.8980555556, 15.7052777778), - ("ESNG", 67.1322222222, 20.8144444444), - ("ESNH", 61.7680555556, 17.0805555556), - ("ESNI", 63.6336111111, 17.9397222222), - ("ESNJ", 66.4961111111, 20.1469444444), - ("ESNK", 63.0483333333, 17.7686111111), - ("ESNL", 64.5480555556, 18.7161111111), - ("ESNM", 63.1286111111, 14.8027777778), - ("ESNN", 62.5280555556, 17.4438888889), - ("ESNO", 63.4083333333, 18.99), - ("ESNP", 65.3994444444, 21.2652777778), - ("ESNQ", 67.8219444444, 20.3366666667), - ("ESNR", 61.19, 14.7125), - ("ESNS", 64.6247222222, 21.0766666667), - ("ESNT", 62.4811111111, 17.0027777778), - ("ESNU", 63.7916666667, 20.2825), - ("ESNV", 64.5788888889, 16.8333333333), - ("ESNX", 65.59, 19.2816666667), - ("ESOE", 59.2236111111, 15.0377777778), - ("ESOH", 60.02, 13.5788888889), - ("ESOW", 59.5894444444, 16.6336111111), - ("ESPA", 65.5436111111, 22.1219444444), - ("ESPC", 63.1938888889, 14.5019444444), - ("ESPE", 65.8752777778, 20.1497222222), - ("ESPJ", 65.8361111111, 21.4713888889), - ("ESQO", 59.3863888889, 15.9238888889), - ("ESSA", 59.6519444444, 17.9186111111), - ("ESSB", 59.3541666667, 17.9413888889), - ("ESSD", 60.4219444444, 15.515), - ("ESSF", 57.5255555556, 15.8238888889), - ("ESSK", 60.5933333333, 16.9513888889), - ("ESSL", 58.4061111111, 15.6802777778), - ("ESSP", 58.5861111111, 16.2505555556), - ("ESST", 60.1575, 12.9911111111), - ("ESSU", 59.3508333333, 16.7083333333), - ("ESSV", 57.6627777778, 18.3461111111), - ("ESUA", 64.5705555556, 19.3141666667), - ("ESUD", 64.9608333333, 17.6963888889), - ("ESUE", 61.8686111111, 12.6905555556), - ("ESUF", 65.1063888889, 20.7605555556), - ("ESUK", 67.7647222222, 20.2572222222), - ("ESUT", 65.8061111111, 15.0827777778), - ("ETAD", 49.9725, 6.6925), - ("ETAR", 49.4375, 7.60138888889), - ("ETEJ", 49.9202777778, 10.9141666667), - ("ETEK", 49.65, 7.3), - ("ETEU", 49.6480555556, 9.96638888889), - ("ETHB", 52.2783333333, 9.08194444444), - ("ETHC", 52.5911111111, 10.0219444444), - ("ETHE", 52.2911111111, 7.38694444444), - ("ETHF", 51.1144444444, 9.28583333333), - ("ETHI", 53.9944444444, 9.57833333333), - ("ETHL", 48.2202777778, 9.91), - ("ETHM", 50.3658333333, 7.315), - ("ETHN", 49.3916666667, 9.95805555556), - ("ETHR", 49.2175, 11.1005555556), - ("ETHS", 52.9191666667, 10.1836111111), - ("ETHT", 51.7677777778, 14.2919444444), - ("ETIC", 49.6994444444, 11.9411111111), - ("ETID", 50.1691666667, 8.96138888889), - ("ETIE", 49.3933333333, 8.65194444444), - ("ETIH", 49.2180555556, 11.8361111111), - ("ETIN", 49.7430555556, 10.2005555556), - ("ETME", 54.6247222222, 9.34138888889), - ("ETMN", 53.7675, 8.65833333333), - ("ETND", 52.5852777778, 8.34055555556), - ("ETNG", 50.9608333333, 6.0425), - ("ETNH", 54.3119444444, 9.53805555556), - ("ETNJ", 53.5333333333, 7.88861111111), - ("ETNL", 53.9180555556, 12.2791666667), - ("ETNN", 50.8311111111, 6.65805555556), - ("ETNP", 52.3386111111, 7.54111111111), - ("ETNR", 51.6636111111, 14.6336111111), - ("ETNS", 54.4591666667, 9.51611111111), - ("ETNT", 53.5477777778, 7.66722222222), - ("ETNU", 53.6019444444, 13.3058333333), - ("ETNW", 52.4572222222, 9.42694444444), - ("ETOI", 49.6336111111, 11.7672222222), - ("ETOR", 49.5633333333, 8.46333333333), - ("ETOU", 50.0497222222, 8.32527777778), - ("ETSA", 48.0705555556, 10.9058333333), - ("ETSB", 50.1736111111, 7.06333333333), - ("ETSE", 48.3222222222, 11.9486111111), - ("ETSF", 48.2055555556, 11.2669444444), - ("ETSH", 51.7677777778, 13.1675), - ("ETSI", 48.7155555556, 11.5338888889), - ("ETSL", 48.1861111111, 10.8622222222), - ("ETSM", 47.9886111111, 10.2394444444), - ("ETSN", 48.7108333333, 11.2111111111), - ("ETUL", 51.6016666667, 6.1425), - ("ETUO", 51.9227777778, 8.30611111111), - ("ETUR", 51.1997222222, 6.13194444444), - ("FAAB", -28.575, 16.5333333333), - ("FAAG", -29.2816666667, 18.8136111111), - ("FAAP", -25.9436111111, 29.81), - ("FABB", -26.2386111111, 28.3016666667), - ("FABE", -32.8969444444, 27.2788888889), - ("FABL", -29.0925, 26.3022222222), - ("FABM", -28.2483333333, 28.3361111111), - ("FABO", -27.3666666667, 26.6291666667), - ("FACR", -26.3694444444, 27.35), - ("FACT", -33.9647222222, 18.6016666667), - ("FACV", -31.5002777778, 19.7258333333), - ("FADA", -30.6366666667, 23.92), - ("FADB", -24.805, 26.8316666667), - ("FADD", -28.1825, 30.2244444444), - ("FADN", -29.97, 30.9502777778), - ("FAEL", -33.0355555556, 27.8258333333), - ("FAEO", -26.4952777778, 29.98), - ("FAER", -23.7261111111, 27.6875), - ("FAFB", -28.8230555556, 27.9088888889), - ("FAGC", -25.9861111111, 28.14), - ("FAGG", -34.0052777778, 22.3788888889), - ("FAGI", -23.2836111111, 30.6497222222), - ("FAGM", -26.2425, 28.1511111111), - ("FAGT", -33.2847222222, 26.4980555556), - ("FAGY", -29.1219444444, 30.5866666667), - ("FAHA", -28.0786111111, 26.8611111111), - ("FAHE", -25.9794444444, 29.6186111111), - ("FAHG", -26.5061111111, 28.3938888889), - ("FAHO", -27.2783333333, 27.9958333333), - ("FAHR", -28.235, 29.1061111111), - ("FAHS", -24.3686111111, 31.0486111111), - ("FAHV", -30.5619444444, 25.5280555556), - ("FAJS", -26.1391666667, 28.2458333333), - ("FAKD", -26.8708333333, 26.7177777778), - ("FAKG", -26.0933333333, 29.4547222222), - ("FAKL", -26.2516666667, 29.1944444444), - ("FAKM", -28.8027777778, 24.765), - ("FAKP", -25.4405555556, 31.9297222222), - ("FAKR", -26.0808333333, 27.7255555556), - ("FAKS", -27.6605555556, 27.3155555556), - ("FAKU", -27.4566666667, 23.4113888889), - ("FAKZ", -29.6883333333, 17.0938888889), - ("FALA", -25.9383333333, 27.9261111111), - ("FALB", -29.1811111111, 27.4530555556), - ("FALI", -26.1755555556, 26.1844444444), - ("FALT", -23.1597222222, 29.6963888889), - ("FALW", -32.9688888889, 18.1602777778), - ("FALY", -28.5816666667, 29.7497222222), - ("FAMB", -25.6847222222, 29.44), - ("FAMG", -30.8572222222, 30.3427777778), - ("FAMI", -24.9888888889, 29.2830555556), - ("FAMJ", -27.0791666667, 29.7783333333), - ("FAMK", -25.7527777778, 25.6119444444), - ("FAMM", -25.7983333333, 25.5477777778), - ("FAMN", -25.4733333333, 31.5655555556), - ("FAMS", -22.3558333333, 29.9863888889), - ("FAMU", -27.6258333333, 32.0441666667), - ("FANC", -27.7705555556, 29.9766666667), - ("FANS", -25.5005555556, 30.9133333333), - ("FANY", -24.6858333333, 28.4347222222), - ("FAOB", -34.5552777778, 20.2502777778), - ("FAOH", -33.6069444444, 22.1888888889), - ("FAPB", -23.8452777778, 29.4586111111), - ("FAPE", -33.9847222222, 25.6172222222), - ("FAPG", -34.0902777778, 23.3277777778), - ("FAPH", -23.9369444444, 31.1552777778), - ("FAPI", -23.9258333333, 29.4841666667), - ("FAPJ", -31.6058333333, 29.5197222222), - ("FAPM", -29.6488888889, 30.3986111111), - ("FAPN", -25.3336111111, 27.1733333333), - ("FAPP", -24.2302777778, 28.9836111111), - ("FAPQ", -25.8469444444, 23.5377777778), - ("FAPS", -26.6708333333, 27.0816666667), - ("FAPY", -26.8891666667, 27.5033333333), - ("FAQT", -31.92, 26.8819444444), - ("FARB", -28.7408333333, 32.0919444444), - ("FARG", -25.6441666667, 27.2711111111), - ("FARS", -33.8119444444, 19.9027777778), - ("FASB", -29.6891666667, 17.9394444444), - ("FASC", -26.5238888889, 29.17), - ("FASD", -32.9638888889, 17.9691666667), - ("FASI", -26.2483333333, 28.3975), - ("FASK", -25.8094444444, 28.1644444444), - ("FASS", -27.6483333333, 22.9991666667), - ("FASU", -25.9613888889, 29.2086111111), - ("FASZ", -24.9608333333, 31.5886111111), - ("FATF", -28.26, 22.9930555556), - ("FATH", -23.0786111111, 30.3833333333), - ("FATN", -29.3191666667, 26.8233333333), - ("FATP", -29.0327777778, 26.1575), - ("FATT", -26.7763888889, 29.3386111111), - ("FATZ", -23.8241666667, 30.3291666667), - ("FAUL", -28.3205555556, 31.4163888889), - ("FAUP", -28.4008333333, 21.2605555556), - ("FAUT", -31.5477777778, 28.6741666667), - ("FAVB", -26.9822222222, 24.7286111111), - ("FAVG", -29.7705555556, 31.0583333333), - ("FAVP", -26.6922222222, 27.7777777778), - ("FAVR", -31.6408333333, 18.5447222222), - ("FAVV", -26.5661111111, 27.9605555556), - ("FAVY", -27.7866666667, 30.7952777778), - ("FAWB", -25.6536111111, 28.2241666667), - ("FAWI", -25.8322222222, 29.1919444444), - ("FAWK", -25.83, 28.2225), - ("FAWM", -27.9977777778, 26.6694444444), - ("FAWS", -27.8472222222, 26.3497222222), - ("FAYP", -33.9, 18.4980555556), - ("FAZR", -25.5988888889, 26.0422222222), - ("FBFT", -21.1594444444, 27.4744444444), - ("FBJW", -24.6022222222, 24.6908333333), - ("FBKE", -17.8327777778, 25.1622222222), - ("FBMN", -19.9725, 23.4308333333), - ("FBOR", -21.2663888889, 25.3202777778), - ("FBSK", -24.555, 25.9180555556), - ("FBSP", -22.0583333333, 27.8286111111), - ("FCBB", -4.25166666667, 15.2527777778), - ("FCOI", 1.58944444444, 18.0469444444), - ("FCOM", -0.0213888888889, 15.5752777778), - ("FCOO", -0.531111111111, 15.95), - ("FCOU", 1.61583333333, 16.0377777778), - ("FCPA", -3.48333333333, 12.6166666667), - ("FCPD", -4.20777777778, 12.6608333333), - ("FCPP", -4.81333333333, 11.8858333333), - ("FDMS", -26.5288888889, 31.3075), - ("FEFF", 4.39833333333, 18.5186111111), - ("FEFG", 4.78444444444, 22.7813888889), - ("FEFI", 10.2361111111, 22.7172222222), - ("FEFM", 5.84694444444, 20.6494444444), - ("FEFN", 8.42666666667, 20.635), - ("FEFO", 5.95805555556, 15.6375), - ("FEFR", 6.52805555556, 21.9888888889), - ("FEFT", 4.22138888889, 15.7861111111), - ("FEFY", 45.1541666667, -89.1108333333), - ("FGBT", 1.90527777778, 9.80555555556), - ("FGSL", 3.75527777778, 8.70861111111), - ("FHAW", -7.96944444444, -14.3936111111), - ("FIMP", -20.43, 57.6833333333), - ("FIMR", -19.7577777778, 63.3619444444), - ("FJDG", -7.31305555556, 72.4108333333), - ("FKKC", 4.08916666667, 9.36027777778), - ("FKKD", 4.00583333333, 9.71944444444), - ("FKKI", 4.47305555556, 14.3636111111), - ("FKKL", 10.4513888889, 14.2572222222), - ("FKKM", 5.63666666667, 10.7505555556), - ("FKKN", 7.35694444444, 13.5591666667), - ("FKKR", 9.33583333333, 13.37), - ("FKKU", 5.53694444444, 10.3541666667), - ("FKKV", 6.03916666667, 10.1225), - ("FKKY", 3.83527777778, 11.5236111111), - ("FLKE", -12.5727777778, 27.8938888889), - ("FLKL", -14.9975, 22.6475), - ("FLLI", -17.8216666667, 25.8225), - ("FLLS", -15.3305555556, 28.4525), - ("FLMA", -11.1380555556, 28.875), - ("FLMF", -13.2586111111, 31.9363888889), - ("FLMG", -15.2544444444, 23.1622222222), - ("FLML", -12.5647222222, 28.2986111111), - ("FLND", -12.9980555556, 28.6647222222), - ("FLSO", -12.9002777778, 28.1497222222), - ("FLZB", -13.5386111111, 23.1097222222), - ("FMCH", -11.5336111111, 43.2716666667), - ("FMCI", -12.2980555556, 43.7663888889), - ("FMCN", -11.7105555556, 43.2436111111), - ("FMCV", -12.1316666667, 44.4302777778), - ("FMCZ", -12.8047222222, 45.2811111111), - ("FMEE", -20.8869444444, 55.5102777778), - ("FMEP", -21.3208333333, 55.4247222222), - ("FMMI", -18.7966666667, 47.4786111111), - ("FMMN", -19.5627777778, 45.4508333333), - ("FMMS", -17.0938888889, 49.8158333333), - ("FMMT", -18.1094444444, 49.3925), - ("FMMV", -20.2847222222, 44.3175), - ("FMNA", -12.3491666667, 49.2916666667), - ("FMNC", -16.1638888889, 49.7736111111), - ("FMND", -14.6516666667, 49.6205555556), - ("FMNE", -13.1883333333, 48.9877777778), - ("FMNH", -14.9991666667, 50.32), - ("FMNL", -14.6294444444, 47.7636111111), - ("FMNM", -15.6672222222, 46.3516666667), - ("FMNN", -13.3122222222, 48.3138888889), - ("FMNQ", -16.7419444444, 44.4813888889), - ("FMNR", -15.4366666667, 49.6883333333), - ("FMNS", -14.2786111111, 50.1747222222), - ("FMNV", -13.3758333333, 50.0027777778), - ("FMNW", -14.8986111111, 47.9938888889), - ("FMNZ", -13.4847222222, 48.6325), - ("FMSD", -25.0380555556, 46.9561111111), - ("FMSF", -21.4413888889, 47.1116666667), - ("FMSG", -22.8052777778, 47.8205555556), - ("FMSK", -22.1197222222, 48.0216666667), - ("FMSM", -21.2016666667, 48.3580555556), - ("FMSR", -21.7536111111, 43.3752777778), - ("FMST", -23.3833333333, 43.7283333333), - ("FNBC", -6.26972222222, 14.2469444444), - ("FNBG", -12.6088888889, 13.4036111111), - ("FNCA", -5.59694444444, 12.1883333333), - ("FNCH", -7.3575, 20.8036111111), - ("FNCX", -8.37361111111, 18.9236111111), - ("FNCZ", -11.8936111111, 22.9161111111), - ("FNGI", -17.0447222222, 15.6869444444), - ("FNHU", -12.8086111111, 15.7602777778), - ("FNKU", -12.4044444444, 16.9472222222), - ("FNLB", -12.3711111111, 13.5363888889), - ("FNLU", -8.85833333333, 13.2311111111), - ("FNMA", -9.525, 16.3122222222), - ("FNME", -14.6575, 17.7197222222), - ("FNMO", -15.2611111111, 12.1466666667), - ("FNNG", -7.75444444444, 15.2875), - ("FNPA", -10.7219444444, 13.7652777778), - ("FNSA", -9.68888888889, 20.4316666667), - ("FNSO", -6.14083333333, 12.3716666667), - ("FNTO", -7.14722222222, 14.2480555556), - ("FNUE", -11.7680555556, 19.8975), - ("FNUG", -7.60305555556, 15.0277777778), - ("FNXA", -16.7552777778, 14.9652777778), - ("FOGO", 1.54111111111, 11.5808333333), - ("FOGQ", -0.665277777778, 13.6730555556), - ("FOGR", -0.704166666667, 10.2455555556), - ("FOOB", 2.07555555556, 11.4930555556), - ("FOOD", -1.5375, 13.2691666667), - ("FOOG", -0.711666666667, 8.75416666667), - ("FOOH", -1.57472222222, 9.26277777778), - ("FOOK", 0.579166666667, 12.8908333333), - ("FOOL", 0.458333333333, 9.41222222222), - ("FOOM", 0.775555555556, 11.5525), - ("FOON", -1.65611111111, 13.4377777778), - ("FOOR", -0.826388888889, 12.7466666667), - ("FOOT", -2.88888888889, 10.9194444444), - ("FPPR", 1.66277777778, 7.41166666667), - ("FPST", 0.378055555556, 6.71194444444), - ("FQBR", -19.7963888889, 34.9075), - ("FQCB", -14.82, 36.5319444444), - ("FQCH", -19.1511111111, 33.4288888889), - ("FQES", -15.7341666667, 32.7566666667), - ("FQIN", -23.8763888889, 35.4083333333), - ("FQLC", -13.2738888889, 35.2661111111), - ("FQLU", -15.0330555556, 40.6716666667), - ("FQMA", -25.9208333333, 32.5725), - ("FQMD", -11.6727777778, 39.5630555556), - ("FQMP", -11.3616666667, 40.3547222222), - ("FQMR", -13.225, 37.5519444444), - ("FQNC", -14.4880555556, 40.7122222222), - ("FQNP", -15.1055555556, 39.2816666667), - ("FQPB", -12.9866666667, 40.5222222222), - ("FQQL", -17.8555555556, 36.8691666667), - ("FQSG", -15.6025, 32.7730555556), - ("FQTT", -16.1047222222, 33.64), - ("FQUG", -14.7044444444, 34.3522222222), - ("FQVL", -22.0183333333, 35.3130555556), - ("FSAL", -7.00472222222, 52.7261111111), - ("FSDR", -5.69583333333, 53.6544444444), - ("FSFA", -10.1094444444, 51.1761111111), - ("FSIA", -4.67416666667, 55.5216666667), - ("FSPP", -4.31916666667, 55.6913888889), - ("FSSC", -7.16416666667, 56.2638888889), - ("FTTA", 9.15111111111, 18.3794444444), - ("FTTC", 13.8469444444, 20.8441666667), - ("FTTD", 8.62027777778, 16.0683333333), - ("FTTJ", 12.1336111111, 15.0338888889), - ("FTTP", 9.37916666667, 14.9258333333), - ("FTTY", 17.9169444444, 19.1108333333), - ("FVBU", -20.0172222222, 28.6177777778), - ("FVCP", -17.7513888889, 30.9244444444), - ("FVCZ", -21.0080555556, 31.5783333333), - ("FVFA", -18.0961111111, 25.8391666667), - ("FVGR", -18.9775, 32.4505555556), - ("FVHA", -17.9316666667, 31.0927777778), - ("FVKB", -16.5197222222, 28.8847222222), - ("FVMT", -17.4316666667, 32.1844444444), - ("FVMU", -18.9975, 32.6272222222), - ("FVMV", -20.0552777778, 30.8588888889), - ("FVSH", -20.2894444444, 30.0883333333), - ("FVTL", -19.4366666667, 29.8616666667), - ("FVWN", -18.6297222222, 27.0208333333), - ("FVZC", -19.0286111111, 29.7219444444), - ("FWCL", -15.6788888889, 34.9738888889), - ("FWKA", -9.95333333333, 33.8927777778), - ("FWKG", -13.0144444444, 33.4683333333), - ("FWMG", 30.8377777778, -85.1816666667), - ("FWUU", -11.4447222222, 34.0116666667), - ("FXMM", -29.4622222222, 27.5525), - ("FXMU", -29.3038888889, 27.5033333333), - ("FZAA", -4.38555555556, 15.4444444444), - ("FZAB", -4.32472222222, 15.3283333333), - ("FZAG", -5.93083333333, 12.3516666667), - ("FZAI", -5.91805555556, 12.4475), - ("FZAM", -5.79944444444, 13.4408333333), - ("FZBO", -3.31111111111, 17.3816666667), - ("FZCA", -5.03555555556, 18.7855555556), - ("FZEA", 0.0225, 18.2886111111), - ("FZFD", 4.25305555556, 20.9752777778), - ("FZFK", 3.23527777778, 19.7711111111), - ("FZFP", 4.1575, 21.6508333333), - ("FZGA", 2.17055555556, 21.4966666667), - ("FZIA", 0.5175, 25.155), - ("FZJH", 2.8275, 27.5880555556), - ("FZKA", 1.56555555556, 30.2208333333), - ("FZKJ", 2.81777777778, 24.7938888889), - ("FZMA", -2.30888888889, 28.8086111111), - ("FZNA", -1.67055555556, 29.2383333333), - ("FZOA", -2.91916666667, 25.9152777778), - ("FZQA", -11.5911111111, 27.5308333333), - ("FZQM", -10.7658333333, 25.5055555556), - ("FZRF", -5.87555555556, 29.25), - ("FZSA", -8.64194444444, 25.2527777778), - ("FZTL", -9.46944444444, 25.7588888889), - ("FZUA", -5.9, 22.4691666667), - ("FZWA", -6.12111111111, 23.5688888889), - ("GABS", 12.5333333333, -7.94972222222), - ("GAGO", 16.2483333333, -0.00527777777778), - ("GAKY", 14.4311111111, -11.4394444444), - ("GAMB", 14.5127777778, -4.07944444444), - ("GANR", 15.2386111111, -9.57638888889), - ("GATB", 16.7302777778, -3.0075), - ("GATS", 20.2461111111, 0.980833333333), - ("GBYD", 13.3377777778, -16.6519444444), - ("GCFV", 28.4525, -13.8636111111), - ("GCHI", 27.8147222222, -17.8869444444), - ("GCLA", 28.6263888889, -17.7555555556), - ("GCLP", 27.9316666667, -15.3863888889), - ("GCRR", 28.9452777778, -13.605), - ("GCTS", 28.0444444444, -16.5722222222), - ("GCXO", 28.4825, -16.3413888889), - ("GEML", 35.2797222222, -2.95611111111), - ("GFHA", 8.39444444444, -13.1283333333), - ("GFLL", 8.61638888889, -13.1952777778), - ("GGCF", 11.2880555556, -15.1805555556), - ("GGOV", 11.8947222222, -15.6536111111), - ("GLMR", 6.28888888889, -10.7586111111), - ("GLRB", 6.23361111111, -10.3622222222), - ("GMAA", 30.3811111111, -9.54611111111), - ("GMAT", 28.4480555556, -11.1611111111), - ("GMFF", 33.9272222222, -4.97777777778), - ("GMFI", 33.5052777778, -5.15277777778), - ("GMFK", 31.9488888889, -4.40055555556), - ("GMFM", 33.8788888889, -5.515), - ("GMFN", 35.1533333333, -2.92), - ("GMFO", 34.7869444444, -1.92388888889), - ("GMMC", 33.5533333333, -7.66138888889), - ("GMME", 34.0513888889, -6.75138888889), - ("GMMF", 29.3688888889, -10.18), - ("GMMI", 31.4038888889, -9.68472222222), - ("GMMN", 33.3677777778, -7.58777777778), - ("GMMX", 31.6066666667, -8.03611111111), - ("GMMY", 34.2988888889, -6.59583333333), - ("GMMZ", 30.9388888889, -6.90916666667), - ("GMTA", 35.1769444444, -3.83944444444), - ("GMTN", 35.5941666667, -5.32), - ("GMTT", 35.7266666667, -5.91666666667), - ("GOGG", 12.5555555556, -16.2816666667), - ("GOGK", 12.88, -14.9552777778), - ("GOGS", 12.41, -16.7461111111), - ("GOOK", 14.1466666667, -16.0511111111), - ("GOOY", 14.7394444444, -17.49), - ("GOSS", 16.0497222222, -16.4611111111), - ("GOTB", 14.8472222222, -12.4680555556), - ("GOTK", 12.5722222222, -12.2202777778), - ("GOTT", 13.7366666667, -13.6530555556), - ("GQNA", 16.7111111111, -9.63777777778), - ("GQND", 18.5702777778, -11.4230555556), - ("GQNF", 16.5897222222, -11.4061111111), - ("GQNI", 16.6219444444, -7.31444444444), - ("GQNK", 16.1594444444, -13.5075), - ("GQNN", 18.0977777778, -15.9477777778), - ("GQNS", 15.1794444444, -12.2072222222), - ("GQPA", 20.5066666667, -13.0430555556), - ("GQPP", 20.9283333333, -17.0311111111), - ("GQPT", 25.2366666667, -11.5886111111), - ("GUFA", 10.3505555556, -13.5691666667), - ("GUFH", 10.0355555556, -10.7697222222), - ("GULB", 11.3261111111, -12.2869444444), - ("GUMA", 8.48111111111, -9.52583333333), - ("GUNZ", 7.80583333333, -8.70166666667), - ("GVAC", 16.7413888889, -22.9494444444), - ("GVBA", 16.1366666667, -22.8888888889), - ("GVFM", 14.9244444444, -23.4933333333), - ("GVMA", 15.1558333333, -23.2136111111), - ("GVSN", 16.5883333333, -24.2844444444), - ("GVSV", 16.8338888889, -25.0566666667), - ("HAAB", 8.97694444444, 38.8), - ("HAAL", 9.00361111111, 38.7255555556), - ("HABD", 11.6080555556, 37.3213888889), - ("HADR", 9.625, 41.8541666667), - ("HAGM", 8.12833333333, 34.5633333333), - ("HAGN", 12.5183333333, 37.4322222222), - ("HAHM", 8.71555555556, 39.0080555556), - ("HAJM", 7.66583333333, 36.8163888889), - ("HALL", 11.9747222222, 38.9797222222), - ("HAMK", 13.4672222222, 39.5333333333), - ("HBBA", -3.32388888889, 29.3183333333), - ("HCMB", 3.09861111111, 43.6241666667), - ("HCMH", 9.51805555556, 44.0886111111), - ("HCMI", 10.3891666667, 44.9408333333), - ("HCMK", -0.377222222222, 42.4591666667), - ("HCMM", 2.01361111111, 45.3047222222), - ("HEAR", 31.0733333333, 33.8358333333), - ("HEAT", 27.0463888889, 31.0119444444), - ("HEAX", 31.1838888889, 29.9488888889), - ("HEBL", 22.3758333333, 31.6116666667), - ("HECA", 30.1219444444, 31.4055555556), - ("HECW", 30.1161111111, 30.9152777778), - ("HEEM", 30.0744444444, 31.1919444444), - ("HEGN", 27.1838888889, 33.7983333333), - ("HEGR", 31.0688888889, 34.1291666667), - ("HELX", 25.6708333333, 32.7063888889), - ("HEMM", 31.3252777778, 27.2216666667), - ("HEPS", 31.2794444444, 32.24), - ("HESC", 28.6852777778, 34.0625), - ("HESN", 23.9641666667, 32.8197222222), - ("HETR", 28.2088888889, 33.6452777778), - ("HKEL", 0.404166666667, 35.2380555556), - ("HKGA", -0.463333333333, 39.6480555556), - ("HKIS", 0.339166666667, 37.5908333333), - ("HKKG", 0.271111111111, 34.7872222222), - ("HKKI", -0.0861111111111, 34.7288888889), - ("HKKT", 0.971944444444, 34.9583333333), - ("HKLK", 4.20416666667, 34.3480555556), - ("HKLO", 3.12194444444, 35.6086111111), - ("HKLU", -2.25222222222, 40.9130555556), - ("HKLY", 2.76305555556, 36.7183333333), - ("HKMA", 3.93361111111, 41.8441666667), - ("HKMB", 2.345, 37.9991666667), - ("HKMK", 0.230277777778, 38.1702777778), - ("HKML", -3.22916666667, 40.1016666667), - ("HKMO", -4.03472222222, 39.5941666667), - ("HKMY", 3.46972222222, 39.1013888889), - ("HKNI", -0.368888888889, 36.98), - ("HKNV", -0.787777777778, 36.4333333333), - ("HKNW", -1.32166666667, 36.8147222222), - ("HKNY", -0.0608333333333, 37.0386111111), - ("HKRE", -1.27722222222, 36.8622222222), - ("HKWJ", 1.73305555556, 40.0913888889), - ("HLFL", 28.7952777778, 22.0808333333), - ("HLGL", 28.6383333333, 21.4377777778), - ("HLGT", 25.1455555556, 10.1425), - ("HLKF", 24.1786111111, 23.3138888889), - ("HLLB", 32.0966666667, 20.2694444444), - ("HLLQ", 32.7886111111, 21.9641666667), - ("HLLS", 26.9869444444, 14.4725), - ("HLLT", 32.6633333333, 13.1588888889), - ("HLMB", 30.3780555556, 19.5763888889), - ("HLNF", 30.5, 18.5269444444), - ("HLON", 29.11, 15.9655555556), - ("HLRA", 29.4697222222, 17.9311111111), - ("HLTD", 30.1516666667, 9.71527777778), - ("HLZA", 28.59, 17.2941666667), - ("HRYG", -1.67694444444, 29.2586111111), - ("HRYR", -1.96861111111, 30.1394444444), - ("HRZA", -2.46222222222, 28.9077777778), - ("HSDN", 19.1536111111, 30.43), - ("HSDZ", 11.7858333333, 34.3363888889), - ("HSFS", 13.615, 25.3247222222), - ("HSKA", 15.3858333333, 36.3280555556), - ("HSNL", 12.0536111111, 24.9552777778), - ("HSOB", 13.1530555556, 30.2325), - ("HSSJ", 4.87194444444, 31.6011111111), - ("HSSM", 9.55861111111, 31.6525), - ("HSSP", 19.5763888889, 37.2158333333), - ("HSSS", 15.5894444444, 32.5530555556), - ("HSWW", 7.72555555556, 27.9794444444), - ("HTAR", -3.36777777778, 36.6333333333), - ("HTDA", -6.87805555556, 39.2025), - ("HTDO", -6.17027777778, 35.7525), - ("HTIR", -7.66861111111, 35.7519444444), - ("HTKJ", -3.42916666667, 37.0744444444), - ("HTLM", -3.37611111111, 35.8180555556), - ("HTMD", -3.51416666667, 33.6188888889), - ("HTMS", -3.36277777778, 37.3233333333), - ("HTMT", -10.3388888889, 40.1816666667), - ("HTMW", -2.44444444444, 32.9325), - ("HTNG", -6.71722222222, 38.1536111111), - ("HTPE", -5.25722222222, 39.8113888889), - ("HTTG", -5.09222222222, 39.0711111111), - ("HTZA", -6.22194444444, 39.2247222222), - ("HUEN", 0.0422222222222, 32.4433333333), - ("HUGU", 2.80555555556, 32.2716666667), - ("HUSO", 1.7275, 33.6227777778), - ("KABI", 32.4111111111, -99.6816666667), - ("KACK", 41.2527777778, -70.06), - ("KACT", 31.6111111111, -97.2302777778), - ("KACY", 39.4575, -74.5769444444), - ("KADM", 34.3030555556, -97.0194444444), - ("KADW", 38.8105555556, -76.8669444444), - ("KAEX", 31.3272222222, -92.5483333333), - ("KAGS", 33.3697222222, -81.9644444444), - ("KAKR", 41.0375, -81.4666666667), - ("KALB", 42.7480555556, -73.8027777778), - ("KALI", 27.7408333333, -98.0269444444), - ("KAMA", 35.2191666667, -101.705833333), - ("KANB", 33.5880555556, -85.8580555556), - ("KAND", 34.495, -82.7091666667), - ("KAOO", 40.2963888889, -78.32), - ("KAPG", 39.4661111111, -76.1694444444), - ("KARA", 30.0375, 91.8838888889), - ("KART", 43.9916666667, -76.0216666667), - ("KATL", 33.6402777778, -84.4269444444), - ("KAUG", 44.3205555556, -69.7972222222), - ("KAUS", 30.1944444444, -97.6697222222), - ("KBAB", 39.1358333333, -121.436388889), - ("KBAD", 32.5016666667, -93.6625), - ("KBCT", 26.3783333333, -80.1075), - ("KBDE", 48.7283333333, -94.6122222222), - ("KBDL", 41.9388888889, -72.6830555556), - ("KBDR", 41.1633333333, -73.1261111111), - ("KBED", 42.4697222222, -71.2888888889), - ("KBFI", 47.5297222222, -122.301944444), - ("KBFL", 35.4333333333, -119.056666667), - ("KBFM", 30.6263888889, -88.0677777778), - ("KBGR", 44.8072222222, -68.8280555556), - ("KBHM", 33.5627777778, -86.7533333333), - ("KBIF", 31.8494444444, -106.38), - ("KBIX", 30.4108333333, -88.9236111111), - ("KBKF", 39.7016666667, -104.751388889), - ("KBLI", 48.7925, -122.5375), - ("KBLV", 38.545, -89.835), - ("KBNA", 36.1244444444, -86.6780555556), - ("KBOI", 43.5641666667, -116.222777778), - ("KBOS", 42.3641666667, -71.005), - ("KBPT", 29.9508333333, -94.0205555556), - ("KBRO", 25.9066666667, -97.4258333333), - ("KBTR", 30.5330555556, -91.1494444444), - ("KBTV", 44.4716666667, -73.1530555556), - ("KBUF", 42.9402777778, -78.7319444444), - ("KBUR", 34.2005555556, -118.358611111), - ("KBWI", 39.1752777778, -76.6683333333), - ("KBYH", 35.9641666667, -89.9433333333), - ("KBYS", 35.2802777778, -116.63), - ("KCAE", 33.9386111111, -81.1194444444), - ("KCAR", 46.8713888889, -68.0177777778), - ("KCBM", 33.6438888889, -88.4436111111), - ("KCDC", 37.7008333333, -113.098611111), - ("KCDS", 34.4336111111, -100.288055556), - ("KCEF", 42.1980555556, -72.5341666667), - ("KCEW", 30.7786111111, -86.5219444444), - ("KCFD", 30.7155555556, -96.3311111111), - ("KCHA", 35.0352777778, -85.2036111111), - ("KCHS", 32.8986111111, -80.0402777778), - ("KCIC", 39.7952777778, -121.858333333), - ("KCLE", 41.4116666667, -81.8497222222), - ("KCLL", 30.5883333333, -96.3636111111), - ("KCLT", 35.2138888889, -80.9430555556), - ("KCMH", 39.9977777778, -82.8916666667), - ("KCNM", 32.3372222222, -104.263055556), - ("KCNW", 31.6377777778, -97.0738888889), - ("KCOF", 28.2347222222, -80.61), - ("KCOS", 38.8055555556, -104.7), - ("KCOT", 28.4580555556, -99.22), - ("KCOU", 38.8180555556, -92.2194444444), - ("KCPR", 42.9077777778, -106.464166667), - ("KCRP", 27.7702777778, -97.5011111111), - ("KCTB", 48.6083333333, -112.376111111), - ("KCVG", 39.0461111111, -84.6619444444), - ("KCVS", 34.3825, -103.321944444), - ("KCXL", 32.6694444444, -115.513055556), - ("KCXO", 30.3516666667, -95.4144444444), - ("KCYS", 41.1555555556, -104.811666667), - ("KDAL", 32.8469444444, -96.8516666667), - ("KDAY", 39.9022222222, -84.2191666667), - ("KDCA", 38.8519444444, -77.0375), - ("KDEN", 39.8583333333, -104.666944444), - ("KDET", 42.4091666667, -83.0097222222), - ("KDFW", 32.8963888889, -97.0375), - ("KDHN", 31.3211111111, -85.4494444444), - ("KDHT", 36.0225, -102.547222222), - ("KDLF", 29.3594444444, -100.777777778), - ("KDLH", 46.8419444444, -92.1936111111), - ("KDMA", 32.1663888889, -110.883055556), - ("KDOV", 39.13, -75.4663888889), - ("KDPA", 41.9077777778, -88.2486111111), - ("KDRI", 30.8316666667, -93.3397222222), - ("KDRO", 37.1513888889, -107.753611111), - ("KDRT", 29.3727777778, -100.925833333), - ("KDSM", 41.5338888889, -93.6625), - ("KDTW", 42.2122222222, -83.3533333333), - ("KDUG", 31.4688888889, -109.603611111), - ("KDYS", 32.4205555556, -99.8544444444), - ("KECG", 36.2605555556, -76.1744444444), - ("KEDW", 34.9052777778, -117.883611111), - ("KEFD", 29.6072222222, -95.1586111111), - ("KEGP", 28.7, -100.479444444), - ("KEKN", 38.8894444444, -79.8569444444), - ("KELD", 33.2208333333, -92.8130555556), - ("KELP", 31.8066666667, -106.377777778), - ("KEND", 36.3397222222, -97.9161111111), - ("KENV", 40.7186111111, -114.030833333), - ("KESF", 31.3947222222, -92.2955555556), - ("KEWN", 35.0727777778, -77.0427777778), - ("KEWR", 40.6922222222, -74.1686111111), - ("KEYW", 24.5561111111, -81.7594444444), - ("KFAF", 37.1325, -76.6086111111), - ("KFAT", 36.7761111111, -119.718055556), - ("KFCS", 38.6783333333, -104.756388889), - ("KFFO", 39.8261111111, -84.0483333333), - ("KFHU", 31.5883333333, -110.344166667), - ("KFLL", 26.0725, -80.1525), - ("KFLO", 34.1852777778, -79.7238888889), - ("KFLV", 39.3683333333, -94.9144444444), - ("KFME", 39.0852777778, -76.7591666667), - ("KFMH", 41.6583333333, -70.5213888889), - ("KFMN", 36.7411111111, -108.229722222), - ("KFMY", 26.5863888889, -81.8630555556), - ("KFOD", 42.5513888889, -94.1925), - ("KFOE", 38.9508333333, -95.6636111111), - ("KFOK", 40.8436111111, -72.6316666667), - ("KFRI", 39.055, -96.7644444444), - ("KFSI", 34.6497222222, -98.4019444444), - ("KFSM", 35.3363888889, -94.3672222222), - ("KFTK", 37.9069444444, -85.9719444444), - ("KFTW", 32.8197222222, -97.3622222222), - ("KFXE", 26.1972222222, -80.1705555556), - ("KFYV", 36.005, -94.17), - ("KGAG", 36.2952777778, -99.7763888889), - ("KGCK", 37.9275, -100.724166667), - ("KGEG", 47.6197222222, -117.533611111), - ("KGFK", 47.9491666667, -97.1761111111), - ("KGGG", 32.3847222222, -94.7113888889), - ("KGLS", 29.2652777778, -94.8602777778), - ("KGNT", 35.1652777778, -107.900555556), - ("KGNV", 29.69, -82.2716666667), - ("KGRB", 44.485, -88.1294444444), - ("KGRF", 47.0791666667, -122.580555556), - ("KGRK", 31.0672222222, -97.8288888889), - ("KGRR", 42.8808333333, -85.5227777778), - ("KGSB", 35.3391666667, -77.9605555556), - ("KGTB", 44.0555555556, -75.7194444444), - ("KGTF", 47.4819444444, -111.370555556), - ("KGUS", 40.6480555556, -86.1519444444), - ("KGVT", 33.0677777778, -96.0652777778), - ("KGVW", 38.8433333333, -94.5605555556), - ("KGWO", 33.4941666667, -90.0844444444), - ("KHBR", 34.9911111111, -99.0511111111), - ("KHFD", 41.7361111111, -72.65), - ("KHHR", 33.9227777778, -118.335), - ("KHIB", 47.3863888889, -92.8388888889), - ("KHIF", 41.1238888889, -111.972777778), - ("KHKY", 35.7411111111, -81.3894444444), - ("KHLN", 46.6066666667, -111.9825), - ("KHLR", 31.1386111111, -97.7144444444), - ("KHMN", 32.8525, -106.106388889), - ("KHOB", 32.6875, -103.216944444), - ("KHON", 44.385, -98.2283333333), - ("KHOP", 36.6683333333, -87.4961111111), - ("KHOU", 29.6452777778, -95.2788888889), - ("KHPN", 41.0669444444, -73.7075), - ("KHRL", 26.2283333333, -97.6541666667), - ("KHRO", 36.2613888889, -93.1547222222), - ("KHRT", 30.4277777778, -86.6891666667), - ("KHST", 25.4883333333, -80.3836111111), - ("KHTL", 44.3597222222, -84.6711111111), - ("KHUA", 34.6786111111, -86.6847222222), - ("KHUF", 39.4513888889, -87.3075), - ("KHUL", 46.1230555556, -67.7919444444), - ("KHVR", 48.5427777778, -109.762222222), - ("KHWO", 26.0013888889, -80.2402777778), - ("KIAB", 37.6227777778, -97.2672222222), - ("KIAD", 38.9444444444, -77.4555555556), - ("KIAG", 43.1072222222, -78.9461111111), - ("KIAH", 29.9802777778, -95.3397222222), - ("KICT", 37.6497222222, -97.4330555556), - ("KIKK", 41.0713888889, -87.8461111111), - ("KIKR", 35.04, -106.609166667), - ("KILG", 39.6786111111, -75.6063888889), - ("KILM", 34.2705555556, -77.9025), - ("KIND", 39.7172222222, -86.2941666667), - ("KINK", 31.7794444444, -103.201111111), - ("KINL", 48.5661111111, -93.4030555556), - ("KINS", 36.5869444444, -115.673333333), - ("KINT", 36.1336111111, -80.2219444444), - ("KIPL", 32.8341666667, -115.578611111), - ("KIPT", 41.2419444444, -76.9211111111), - ("KISN", 48.1777777778, -103.642222222), - ("KISP", 40.795, -73.1), - ("KJAN", 32.3111111111, -90.0758333333), - ("KJAX", 30.4938888889, -81.6877777778), - ("KJBR", 35.8316666667, -90.6461111111), - ("KJFK", 40.6397222222, -73.7788888889), - ("KLAN", 42.7786111111, -84.5872222222), - ("KLAS", 36.0802777778, -115.152222222), - ("KLAX", 33.9425, -118.408055556), - ("KLBB", 33.6636111111, -101.822777778), - ("KLCH", 30.1261111111, -93.2233333333), - ("KLCK", 39.8136111111, -82.9277777778), - ("KLFI", 37.0827777778, -76.3602777778), - ("KLFK", 31.2338888889, -94.75), - ("KLFT", 30.2052777778, -91.9875), - ("KLGA", 40.7772222222, -73.8725), - ("KLGB", 33.8175, -118.151388889), - ("KLHW", 31.8888888889, -81.5622222222), - ("KLIT", 34.7294444444, -92.2241666667), - ("KLNA", 26.5927777778, -80.085), - ("KLNK", 40.8508333333, -96.7591666667), - ("KLOU", 38.2277777778, -85.6636111111), - ("KLRD", 27.5436111111, -99.4613888889), - ("KLRF", 34.9180555556, -92.1463888889), - ("KLSF", 32.3372222222, -84.9911111111), - ("KLSV", 36.2361111111, -115.034166667), - ("KLTS", 34.6669444444, -99.2666666667), - ("KLUF", 33.535, -112.383055556), - ("KLUK", 39.1033333333, -84.4186111111), - ("KMAF", 31.9425, -102.201666667), - ("KMCC", 38.6675, -121.400555556), - ("KMCF", 27.8491666667, -82.5211111111), - ("KMCI", 39.2975, -94.7138888889), - ("KMCN", 32.6927777778, -83.6491666667), - ("KMCO", 28.4288888889, -81.3158333333), - ("KMDT", 40.1933333333, -76.7633333333), - ("KMDW", 41.7858333333, -87.7522222222), - ("KMEM", 35.0422222222, -89.9766666667), - ("KMER", 37.3802777778, -120.568055556), - ("KMFE", 26.1758333333, -98.2386111111), - ("KMGE", 33.9152777778, -84.5161111111), - ("KMHR", 38.5538888889, -121.2975), - ("KMIA", 25.7930555556, -80.2905555556), - ("KMIB", 48.4155555556, -101.3575), - ("KMIV", 39.3677777778, -75.0722222222), - ("KMKE", 42.9472222222, -87.8963888889), - ("KMKL", 35.5997222222, -88.9155555556), - ("KMKO", 35.6575, -95.3613888889), - ("KMLB", 28.1025, -80.645), - ("KMLC", 34.8822222222, -95.7833333333), - ("KMLT", 45.6477777778, -68.6855555556), - ("KMLU", 32.5108333333, -92.0375), - ("KMMV", 45.1944444444, -123.135833333), - ("KMNM", 45.1263888889, -87.6383333333), - ("KMOB", 30.6913888889, -88.2427777778), - ("KMOD", 37.6255555556, -120.954166667), - ("KMOT", 48.2591666667, -101.280277778), - ("KMPV", 44.2033333333, -72.5622222222), - ("KMQT", 46.5338888889, -87.5616666667), - ("KMSN", 43.1397222222, -89.3375), - ("KMSP", 44.8802777778, -93.2166666667), - ("KMSS", 44.9358333333, -74.8452777778), - ("KMSY", 29.9933333333, -90.2577777778), - ("KMTC", 42.6127777778, -82.8316666667), - ("KMUI", 40.4347222222, -76.5691666667), - ("KMUO", 43.0433333333, -115.872222222), - ("KMWH", 47.2075, -119.32), - ("KMWL", 32.7813888889, -98.06), - ("KMXF", 32.3791666667, -86.3625), - ("KMYR", 33.6797222222, -78.9283333333), - ("KNBC", 32.4772222222, -80.7230555556), - ("KNBG", 29.8252777778, -90.035), - ("KNCA", 34.7083333333, -77.4394444444), - ("KNEL", 40.0333333333, -74.3533333333), - ("KNFL", 39.4163888889, -118.700833333), - ("KNGU", 36.9375, -76.2891666667), - ("KNHK", 38.2858333333, -76.4116666667), - ("KNID", 35.6877777778, -117.690555556), - ("KNIP", 30.2358333333, -81.6805555556), - ("KNJK", 32.8291666667, -115.671666667), - ("KNKT", 34.9025, -76.8808333333), - ("KNKX", 32.8683333333, -117.1425), - ("KNLC", 36.3327777778, -119.951944444), - ("KNMM", 32.5519444444, -88.5555555556), - ("KNOW", 48.1413888889, -123.413888889), - ("KNPA", 30.3525, -87.3186111111), - ("KNQA", 35.3566666667, -89.8702777778), - ("KNQI", 27.5072222222, -97.8097222222), - ("KNQX", 24.5758333333, -81.6888888889), - ("KNSE", 30.7241666667, -87.0219444444), - ("KNTD", 34.1202777778, -119.120833333), - ("KNTK", 33.7061111111, -117.827222222), - ("KNTU", 36.8205555556, -76.0333333333), - ("KNUQ", 37.415, -122.048055556), - ("KNUW", 48.3516666667, -122.655833333), - ("KNXP", 34.2961111111, -116.161944444), - ("KNXX", 40.1997222222, -75.1480555556), - ("KNYG", 38.5016666667, -77.3052777778), - ("KNZC", 30.2186111111, -81.8763888889), - ("KNZY", 32.6991666667, -117.215277778), - ("KOAK", 37.7211111111, -122.220555556), - ("KOFF", 41.1183333333, -95.9125), - ("KOGS", 44.6819444444, -75.4655555556), - ("KOKC", 35.3930555556, -97.6005555556), - ("KOLS", 31.4175, -110.847777778), - ("KOMA", 41.3025, -95.8936111111), - ("KONT", 34.0558333333, -117.601111111), - ("KOPF", 25.9069444444, -80.2783333333), - ("KORD", 41.9794444444, -87.9044444444), - ("KORF", 36.8944444444, -76.2011111111), - ("KORL", 28.5452777778, -81.3327777778), - ("KOSC", 44.4513888889, -83.3938888889), - ("KPAE", 47.9061111111, -122.281388889), - ("KPAM", 30.0697222222, -85.5763888889), - ("KPBF", 34.1747222222, -91.9344444444), - ("KPBG", 44.6508333333, -73.4680555556), - ("KPBI", 26.6830555556, -80.0955555556), - ("KPDX", 45.5886111111, -122.5975), - ("KPHF", 37.1316666667, -76.4927777778), - ("KPHL", 39.8719444444, -75.2411111111), - ("KPHN", 42.9108333333, -82.5286111111), - ("KPHX", 33.4341666667, -112.008055556), - ("KPIE", 27.9105555556, -82.6872222222), - ("KPIT", 40.4913888889, -80.2327777778), - ("KPMB", 48.9425, -97.2408333333), - ("KPMD", 34.6291666667, -118.084444444), - ("KPNC", 36.7305555556, -97.0997222222), - ("KPNE", 40.0819444444, -75.0105555556), - ("KPNM", 45.5597222222, -93.6080555556), - ("KPNS", 30.4730555556, -87.1872222222), - ("KPOB", 35.1708333333, -79.0144444444), - ("KPOE", 31.0447222222, -93.1913888889), - ("KPQI", 46.6888888889, -68.0447222222), - ("KPRC", 34.6544444444, -112.419444444), - ("KPSP", 33.8294444444, -116.506666667), - ("KPSX", 28.7275, -96.2508333333), - ("KPUB", 38.2888888889, -104.496388889), - ("KPVD", 41.7238888889, -71.4280555556), - ("KPWM", 43.6461111111, -70.3086111111), - ("KRAL", 33.9516666667, -117.445), - ("KRBM", 34.85, -92.3), - ("KRCA", 44.145, -103.103333333), - ("KRDR", 47.9608333333, -97.4011111111), - ("KRDU", 35.8775, -78.7872222222), - ("KRIC", 37.505, -77.3194444444), - ("KRIU", 38.4886111111, -121.102222222), - ("KRIV", 33.8805555556, -117.259444444), - ("KRME", 43.2336111111, -75.4069444444), - ("KRND", 29.5294444444, -98.2788888889), - ("KRNO", 39.4983333333, -119.768055556), - ("KROC", 43.1186111111, -77.6722222222), - ("KROW", 33.3013888889, -104.530555556), - ("KRSW", 26.5361111111, -81.755), - ("KSAC", 38.5125, -121.493333333), - ("KSAF", 35.6166666667, -106.088055556), - ("KSAN", 32.7333333333, -117.189444444), - ("KSAT", 29.5336111111, -98.4697222222), - ("KSAV", 32.1275, -81.2019444444), - ("KSAW", 46.3536111111, -87.3958333333), - ("KSBO", 32.6083333333, -82.3686111111), - ("KSBY", 38.3402777778, -75.5102777778), - ("KSCK", 37.8941666667, -121.238611111), - ("KSEA", 47.4488888889, -122.309166667), - ("KSEM", 32.3438888889, -86.9877777778), - ("KSFF", 47.6827777778, -117.3225), - ("KSFO", 37.6188888889, -122.374722222), - ("KSFZ", 41.9205555556, -71.4911111111), - ("KSHV", 32.4463888889, -93.8255555556), - ("KSJC", 37.3616666667, -121.928888889), - ("KSJT", 31.3575, -100.496111111), - ("KSKA", 47.615, -117.655555556), - ("KSKF", 29.3841666667, -98.5808333333), - ("KSKY", 41.4333333333, -82.6522222222), - ("KSLC", 40.7883333333, -111.9775), - ("KSMF", 38.6952777778, -121.590555556), - ("KSNA", 33.6755555556, -117.868055556), - ("KSPB", 45.7725, -122.862222222), - ("KSPG", 27.765, -82.6269444444), - ("KSPS", 33.9886111111, -98.4916666667), - ("KSSC", 33.9727777778, -80.4727777778), - ("KSTL", 38.7475, -90.3597222222), - ("KSUU", 38.2625, -121.927222222), - ("KSUX", 42.4025, -96.3841666667), - ("KSVN", 32.01, -81.1455555556), - ("KSWF", 41.5038888889, -74.1047222222), - ("KSYR", 43.1111111111, -76.1061111111), - ("KSZL", 38.7302777778, -93.5477777778), - ("KTBN", 37.7413888889, -92.1405555556), - ("KTCC", 35.1827777778, -103.603055556), - ("KTCM", 47.1375, -122.476388889), - ("KTCS", 33.2369444444, -107.271666667), - ("KTEB", 40.8497222222, -74.0608333333), - ("KTIK", 35.4147222222, -97.3863888889), - ("KTLH", 30.3963888889, -84.3502777778), - ("KTMB", 25.6477777778, -80.4327777778), - ("KTNT", 25.8616666667, -80.8969444444), - ("KTNX", 37.7944444444, -116.778611111), - ("KTPA", 27.9752777778, -82.5330555556), - ("KTTN", 40.2766666667, -74.8133333333), - ("KTUL", 36.1983333333, -95.8880555556), - ("KTUS", 32.1161111111, -110.941388889), - ("KTXK", 33.4536111111, -93.9908333333), - ("KTYR", 32.3538888889, -95.4022222222), - ("KTYS", 35.8122222222, -83.9927777778), - ("KUGN", 42.4219444444, -87.8677777778), - ("KVAD", 30.9677777778, -83.1927777778), - ("KVBG", 34.7294444444, -120.576666667), - ("KVCV", 34.5930555556, -117.379444444), - ("KVPS", 30.4830555556, -86.5252777778), - ("KVRB", 27.6555555556, -80.4177777778), - ("KWAL", 37.94, -75.4663888889), - ("KWRB", 32.64, -83.5916666667), - ("KWRI", 40.0155555556, -74.5936111111), - ("KWSD", 32.3413888889, -106.4025), - ("KWWD", 39.0083333333, -74.9080555556), - ("KYIP", 42.2377777778, -83.5302777778), - ("KYNG", 41.2605555556, -80.6788888889), - ("KYUM", 32.6563888889, -114.605833333), - ("KZUN", 35.0833333333, -108.791666667), - ("LATI", 41.4147222222, 19.7205555556), - ("LBBG", 42.5688888889, 27.5138888889), - ("LBGO", 43.1513888889, 25.7127777778), - ("LBPD", 42.0677777778, 24.8508333333), - ("LBSF", 42.695, 23.4061111111), - ("LBSZ", 42.3766666667, 25.655), - ("LBWN", 43.2319444444, 27.825), - ("LCLK", 34.875, 33.6247222222), - ("LCPH", 34.7177777778, 32.4855555556), - ("LCRA", 34.5902777778, 32.9877777778), - ("LDDU", 42.5611111111, 18.2680555556), - ("LDOC", 45.5419444444, 18.6361111111), - ("LDOS", 45.4625, 18.8113888889), - ("LDPL", 44.8933333333, 13.9219444444), - ("LDRG", 45.3794444444, 14.5036111111), - ("LDRI", 45.2166666667, 14.57), - ("LDSP", 43.5388888889, 16.2977777778), - ("LDVA", 46.2947222222, 16.3811111111), - ("LDZA", 45.7427777778, 16.0686111111), - ("LDZD", 44.1080555556, 15.3466666667), - ("LDZU", 44.5575, 15.7741666667), - ("LEAB", 38.9483333333, -1.86333333333), - ("LEAL", 38.2819444444, -0.558055555556), - ("LEAM", 36.8438888889, -2.37), - ("LEAS", 43.5633333333, -6.03444444444), - ("LEBA", 37.8419444444, -4.84861111111), - ("LEBB", 43.3008333333, -2.91055555556), - ("LEBG", 42.3575, -3.62055555556), - ("LEBL", 41.2969444444, 2.07833333333), - ("LEBZ", 38.8911111111, -6.82111111111), - ("LECO", 43.3019444444, -8.37722222222), - ("LEGA", 37.1330555556, -3.63555555556), - ("LEGE", 41.9008333333, 2.76027777778), - ("LEGR", 37.1886111111, -3.77722222222), - ("LEGT", 40.2938888889, -3.72361111111), - ("LEIB", 38.8727777778, 1.37305555556), - ("LEJR", 36.7444444444, -6.06), - ("LELC", 37.7747222222, -0.812222222222), - ("LELN", 42.5888888889, -5.65555555556), - ("LEMD", 40.4722222222, -3.56083333333), - ("LEMG", 36.6736111111, -4.49888888889), - ("LEMH", 39.8625, 4.21861111111), - ("LEMM", 40.4166666667, -3.5), - ("LEMO", 37.1747222222, -5.61583333333), - ("LEOC", 39.9375, -3.50333333333), - ("LEPA", 39.55, 2.73333333333), - ("LEPP", 42.77, -1.64611111111), - ("LERI", 37.9511111111, -1.23027777778), - ("LERS", 41.1472222222, 1.16694444444), - ("LERT", 36.645, -6.34944444444), - ("LESA", 40.9519444444, -5.50194444444), - ("LESB", 39.5988888889, 2.70277777778), - ("LESJ", 39.5516666667, 2.73861111111), - ("LESL", 39.8622222222, 4.25833333333), - ("LESO", 43.3563888889, -1.79055555556), - ("LEST", 42.8961111111, -8.415), - ("LESU", 42.3386111111, 1.40916666667), - ("LETO", 40.4866666667, -3.45805555556), - ("LEVC", 39.4891666667, -0.481388888889), - ("LEVD", 41.7061111111, -4.85194444444), - ("LEVS", 40.3705555556, -3.785), - ("LEVT", 42.8827777778, -2.72444444444), - ("LEVX", 42.2316666667, -8.62666666667), - ("LEXJ", 43.4269444444, -3.82), - ("LEZG", 41.6661111111, -1.04138888889), - ("LEZL", 37.4177777778, -5.89305555556), - ("LFAC", 50.9619444444, 1.95472222222), - ("LFAG", 49.8688888889, 3.02777777778), - ("LFAI", 48.5936111111, 3.005), - ("LFAO", 48.5458333333, -0.387222222222), - ("LFAQ", 49.9713888889, 2.69972222222), - ("LFAT", 50.5147222222, 1.62722222222), - ("LFAV", 50.3255555556, 3.46111111111), - ("LFAY", 49.8713888889, 2.38638888889), - ("LFBA", 44.1747222222, 0.590555555556), - ("LFBC", 44.5333333333, -1.125), - ("LFBD", 44.8283333333, -0.715555555556), - ("LFBE", 44.8252777778, 0.518611111111), - ("LFBF", 43.5455555556, 1.3675), - ("LFBG", 45.6583333333, -0.3175), - ("LFBI", 46.5875, 0.306666666667), - ("LFBK", 46.2244444444, 2.36305555556), - ("LFBL", 45.8627777778, 1.17944444444), - ("LFBM", 43.9116666667, -0.5075), - ("LFBN", 46.3111111111, -0.401388888889), - ("LFBO", 43.6288888889, 1.36361111111), - ("LFBP", 43.38, -0.418611111111), - ("LFBR", 43.4488888889, 1.26333333333), - ("LFBT", 43.1786111111, -0.00638888888889), - ("LFBU", 45.7291666667, 0.221388888889), - ("LFBV", 45.1508333333, 1.46916666667), - ("LFBX", 45.1980555556, 0.815555555556), - ("LFBZ", 43.4683333333, -1.52305555556), - ("LFCC", 44.3511111111, 1.47527777778), - ("LFCG", 43.0075, 1.10305555556), - ("LFCH", 44.5963888889, -1.11083333333), - ("LFCI", 43.9136111111, 2.11305555556), - ("LFCK", 43.5561111111, 2.28916666667), - ("LFCL", 43.5861111111, 1.49916666667), - ("LFCM", 43.99, 3.18305555556), - ("LFCR", 44.4077777778, 2.4825), - ("LFCU", 45.5347222222, 2.42388888889), - ("LFCW", 44.3969444444, 0.758888888889), - ("LFCY", 45.6280555556, -0.9725), - ("LFCZ", 44.1461111111, -1.17444444444), - ("LFDA", 43.7094444444, -0.245277777778), - ("LFDB", 44.0255555556, 1.37777777778), - ("LFDH", 43.6877777778, 0.601666666667), - ("LFDI", 44.9822222222, -0.134722222222), - ("LFDJ", 43.0905555556, 1.69583333333), - ("LFDM", 44.4988888889, 0.200277777778), - ("LFDN", 45.8877777778, -0.983055555556), - ("LFEC", 48.4627777778, -5.06388888889), - ("LFED", 48.0583333333, -2.92166666667), - ("LFES", 48.0525, -3.66444444444), - ("LFEY", 46.7186111111, -2.39111111111), - ("LFFI", 47.4080555556, -1.1775), - ("LFFN", 48.4297222222, 4.48111111111), - ("LFGA", 48.1097222222, 7.35888888889), - ("LFGF", 47.0058333333, 4.89333333333), - ("LFGJ", 47.0388888889, 5.42722222222), - ("LFGK", 47.9922222222, 3.39222222222), - ("LFGW", 49.1222222222, 5.46888888889), - ("LFHO", 44.5441666667, 4.37194444444), - ("LFHP", 45.0794444444, 3.76472222222), - ("LFHQ", 45.0763888889, 2.99361111111), - ("LFHS", 46.2008333333, 5.29194444444), - ("LFHV", 45.9163888889, 4.64055555556), - ("LFHY", 46.5344444444, 3.42361111111), - ("LFIG", 44.1775, 2.515), - ("LFIO", 43.5688888889, 1.48083333333), - ("LFJL", 48.9822222222, 6.25361111111), - ("LFKB", 42.5538888889, 9.48333333333), - ("LFKC", 42.5305555556, 8.79305555556), - ("LFKF", 41.5005555556, 9.09777777778), - ("LFKJ", 41.9236111111, 8.80277777778), - ("LFKO", 41.6630555556, 8.89027777778), - ("LFKS", 41.9241666667, 9.40583333333), - ("LFKT", 42.2936111111, 9.19305555556), - ("LFLA", 47.85, 3.49694444444), - ("LFLB", 45.6377777778, 5.88), - ("LFLC", 45.7863888889, 3.16916666667), - ("LFLD", 47.0580555556, 2.37027777778), - ("LFLE", 45.5608333333, 5.97555555556), - ("LFLH", 46.8258333333, 4.8175), - ("LFLI", 46.1919444444, 6.26833333333), - ("LFLL", 45.7261111111, 5.09083333333), - ("LFLM", 46.295, 4.79555555556), - ("LFLN", 46.4125, 4.01305555556), - ("LFLO", 46.0583333333, 4.00138888889), - ("LFLP", 45.9291666667, 6.09861111111), - ("LFLS", 45.3627777778, 5.32916666667), - ("LFLT", 46.3525, 2.57027777778), - ("LFLU", 44.9213888889, 4.96972222222), - ("LFLV", 46.1694444444, 3.40361111111), - ("LFLW", 44.8913888889, 2.42194444444), - ("LFLX", 46.8619444444, 1.73055555556), - ("LFLY", 45.7280555556, 4.94472222222), - ("LFMA", 43.5052777778, 5.36777777778), - ("LFMC", 43.3844444444, 6.38694444444), - ("LFMD", 43.5419444444, 6.95333333333), - ("LFMH", 45.5402777778, 4.29638888889), - ("LFMI", 43.5225, 4.92361111111), - ("LFMK", 43.2158333333, 2.30611111111), - ("LFML", 43.4355555556, 5.21361111111), - ("LFMN", 43.6605555556, 7.2175), - ("LFMO", 44.1402777778, 4.86666666667), - ("LFMP", 42.7402777778, 2.87055555556), - ("LFMQ", 43.2525, 5.785), - ("LFMS", 44.0694444444, 4.14194444444), - ("LFMT", 43.5761111111, 3.96277777778), - ("LFMU", 43.3238888889, 3.35555555556), - ("LFMV", 43.9072222222, 4.90166666667), - ("LFMY", 43.6063888889, 5.10916666667), - ("LFMZ", 43.1758333333, 2.73416666667), - ("LFNB", 44.5019444444, 3.53277777778), - ("LFNH", 44.0297222222, 5.07805555556), - ("LFOA", 47.0533333333, 2.6325), - ("LFOB", 49.4544444444, 2.11277777778), - ("LFOC", 48.0580555556, 1.37638888889), - ("LFOD", 47.2566666667, -0.115), - ("LFOE", 49.0286111111, 1.21972222222), - ("LFOH", 49.5338888889, 0.0880555555556), - ("LFOI", 50.1433333333, 1.83166666667), - ("LFOJ", 47.9877777778, 1.76055555556), - ("LFOK", 48.7758333333, 4.18444444444), - ("LFOP", 49.3841666667, 1.17472222222), - ("LFOT", 47.4322222222, 0.7275), - ("LFOU", 47.0819444444, -0.876944444444), - ("LFOV", 48.0311111111, -0.742777777778), - ("LFOZ", 47.8969444444, 2.16333333333), - ("LFPB", 48.9694444444, 2.44138888889), - ("LFPC", 49.2533333333, 2.51888888889), - ("LFPG", 49.0127777778, 2.55), - ("LFPK", 48.8375, 3.01611111111), - ("LFPM", 48.6047222222, 2.67111111111), - ("LFPN", 48.7516666667, 2.10611111111), - ("LFPO", 48.7252777778, 2.35944444444), - ("LFPT", 49.0963888889, 2.04083333333), - ("LFPV", 48.7741666667, 2.20138888889), - ("LFPY", 48.5966666667, 2.33138888889), - ("LFQA", 49.2077777778, 4.15666666667), - ("LFQB", 48.3227777778, 4.01777777778), - ("LFQC", 48.5972222222, 6.54472222222), - ("LFQE", 49.2266666667, 5.67194444444), - ("LFQF", 46.9663888889, 4.26027777778), - ("LFQG", 47.0011111111, 3.11444444444), - ("LFQI", 50.2216666667, 3.15416666667), - ("LFQJ", 50.3102777778, 4.03305555556), - ("LFQM", 47.2083333333, 6.08305555556), - ("LFQP", 48.7661111111, 7.20027777778), - ("LFQQ", 50.5616666667, 3.08944444444), - ("LFQT", 50.6183333333, 2.64222222222), - ("LFQV", 49.7838888889, 4.64694444444), - ("LFQW", 47.6375, 6.20388888889), - ("LFRA", 47.4972222222, -0.5725), - ("LFRB", 48.4477777778, -4.41833333333), - ("LFRC", 49.65, -1.47027777778), - ("LFRD", 48.5877777778, -2.08), - ("LFRE", 47.2894444444, -2.34638888889), - ("LFRF", 48.8830555556, -1.56416666667), - ("LFRG", 49.3652777778, 0.154166666667), - ("LFRH", 47.7605555556, -3.44), - ("LFRI", 46.7019444444, -1.37861111111), - ("LFRJ", 48.53, -4.15138888889), - ("LFRK", 49.1733333333, -0.45), - ("LFRL", 48.2816666667, -4.445), - ("LFRM", 47.9486111111, 0.201666666667), - ("LFRN", 48.0694444444, -1.73472222222), - ("LFRO", 48.7541666667, -3.47138888889), - ("LFRQ", 47.9747222222, -4.16777777778), - ("LFRS", 47.1530555556, -1.61055555556), - ("LFRT", 48.5377777778, -2.85444444444), - ("LFRU", 48.6030555556, -3.81555555556), - ("LFRV", 47.7230555556, -2.71833333333), - ("LFRZ", 47.3119444444, -2.14916666667), - ("LFSB", 47.5894444444, 7.52972222222), - ("LFSC", 47.9219444444, 7.39944444444), - ("LFSD", 47.2688888889, 5.09), - ("LFSF", 49.0716666667, 6.13166666667), - ("LFSG", 48.3247222222, 6.06972222222), - ("LFSH", 48.7933333333, 7.81611111111), - ("LFSI", 48.6358333333, 4.89916666667), - ("LFSL", 48.78, 5.97972222222), - ("LFSM", 47.4869444444, 6.7925), - ("LFSN", 48.6919444444, 6.23027777778), - ("LFSO", 48.5830555556, 5.955), - ("LFSP", 46.9044444444, 6.32694444444), - ("LFSR", 49.31, 4.05), - ("LFST", 48.5380555556, 7.62805555556), - ("LFSX", 47.7830555556, 6.36388888889), - ("LFTF", 43.2477777778, 6.12666666667), - ("LFTH", 43.0972222222, 6.14583333333), - ("LFTW", 43.7572222222, 4.41611111111), - ("LFVM", 47.0952777778, -56.3802777778), - ("LFVP", 46.7625, -56.1752777778), - ("LFXA", 45.9872222222, 5.32833333333), - ("LFXI", 44.0566666667, 5.49527777778), - ("LFYD", 48.0847222222, 5.665), - ("LFYG", 50.1413888889, 3.26305555556), - ("LFYH", 47.335, 5.51361111111), - ("LFYL", 47.7044444444, 6.54583333333), - ("LFYT", 49.7583333333, 3.21194444444), - ("LGAD", 37.9205555556, 21.2925), - ("LGAG", 38.6019444444, 21.3511111111), - ("LGAL", 40.8558333333, 25.9561111111), - ("LGAT", 37.8877777778, 23.7316666667), - ("LGAX", 40.6511111111, 22.4886111111), - ("LGBL", 39.2194444444, 22.7941666667), - ("LGEL", 38.0636111111, 23.5558333333), - ("LGHI", 38.3430555556, 26.1405555556), - ("LGIO", 39.6963888889, 20.8225), - ("LGIR", 35.3394444444, 25.1802777778), - ("LGKA", 40.4494444444, 21.2761111111), - ("LGKC", 36.2741666667, 23.0169444444), - ("LGKF", 38.1197222222, 20.5005555556), - ("LGKL", 37.0683333333, 22.0255555556), - ("LGKM", 40.9722222222, 24.3416666667), - ("LGKO", 36.7933333333, 27.0916666667), - ("LGKP", 35.4213888889, 27.1458333333), - ("LGKR", 39.6019444444, 19.9116666667), - ("LGKS", 35.4211111111, 26.91), - ("LGKV", 40.9130555556, 24.6191666667), - ("LGKZ", 40.2861111111, 21.8408333333), - ("LGLE", 37.1847222222, 26.8002777778), - ("LGLM", 39.9169444444, 25.2361111111), - ("LGLR", 39.65, 22.4652777778), - ("LGMG", 37.9811111111, 23.3652777778), - ("LGMK", 37.435, 25.3480555556), - ("LGMR", 38.145, 24.0141666667), - ("LGMT", 39.0566666667, 26.5983333333), - ("LGPZ", 38.9252777778, 20.7652777778), - ("LGRD", 36.3830555556, 28.1088888889), - ("LGRP", 36.4052777778, 28.0861111111), - ("LGRX", 38.1511111111, 21.4255555556), - ("LGSA", 35.5316666667, 24.1494444444), - ("LGSK", 39.1769444444, 23.5036111111), - ("LGSM", 37.69, 26.9116666667), - ("LGSO", 37.4227777778, 24.9508333333), - ("LGSP", 36.9733333333, 22.5261111111), - ("LGSR", 36.4002777778, 25.4786111111), - ("LGST", 35.2136111111, 26.0975), - ("LGSV", 39.48, 22.7672222222), - ("LGSY", 38.9675, 24.4872222222), - ("LGTG", 38.3397222222, 23.5647222222), - ("LGTL", 35.1869444444, 25.3266666667), - ("LGTP", 37.5308333333, 22.405), - ("LGTS", 40.5197222222, 22.9708333333), - ("LGTT", 38.1088888889, 23.7836111111), - ("LGZA", 37.75, 20.8819444444), - ("LHBP", 47.4366666667, 19.2555555556), - ("LHDC", 47.4888888889, 21.6152777778), - ("LHGD", 47.5708333333, 19.3386111111), - ("LHKE", 46.9175, 19.7491666667), - ("LHKV", 46.3891666667, 17.7313888889), - ("LHNY", 47.9838888889, 21.6922222222), - ("LHOY", 46.3038888889, 18.7691666667), - ("LHPA", 47.3638888889, 17.5008333333), - ("LHSA", 47.0777777778, 17.9683333333), - ("LHSK", 46.8580555556, 18.0955555556), - ("LHSM", 46.6863888889, 17.1588888889), - ("LHSN", 47.1227777778, 20.2352777778), - ("LHTA", 46.3930555556, 17.9172222222), - ("LHTL", 47.3452777778, 18.9808333333), - ("LIBA", 41.5386111111, 15.7133333333), - ("LIBC", 38.9972222222, 17.08), - ("LIBD", 41.1383333333, 16.7605555556), - ("LIBF", 41.4327777778, 15.535), - ("LIBG", 40.5161111111, 17.4022222222), - ("LIBN", 40.2386111111, 18.1330555556), - ("LIBP", 42.4313888889, 14.1808333333), - ("LIBR", 40.6575, 17.9469444444), - ("LIBV", 40.7677777778, 16.9333333333), - ("LICA", 38.9063888889, 16.2422222222), - ("LICC", 37.4666666667, 15.0661111111), - ("LICD", 35.4977777778, 12.6180555556), - ("LICG", 36.8163888889, 11.9686111111), - ("LICJ", 38.1758333333, 13.0908333333), - ("LICP", 38.1108333333, 13.3133333333), - ("LICR", 38.0711111111, 15.6513888889), - ("LICT", 37.9125, 12.4880555556), - ("LICZ", 37.4013888889, 14.9222222222), - ("LIEA", 40.6319444444, 8.29055555556), - ("LIED", 39.3541666667, 8.97222222222), - ("LIEE", 39.2513888889, 9.05416666667), - ("LIEO", 40.8986111111, 9.5175), - ("LIET", 39.9186111111, 9.68277777778), - ("LIIB", 40.4166666667, 12.3333333333), - ("LIMA", 45.0861111111, 7.60305555556), - ("LIMB", 45.5397222222, 9.20222222222), - ("LIMC", 45.6313888889, 8.72777777778), - ("LIME", 45.6738888889, 9.70416666667), - ("LIMF", 45.2005555556, 7.64944444444), - ("LIMG", 44.0505555556, 8.12722222222), - ("LIMJ", 44.4119444444, 8.84166666667), - ("LIML", 45.4452777778, 9.27694444444), - ("LIMN", 45.5294444444, 8.66916666667), - ("LIMP", 44.8244444444, 10.2961111111), - ("LIMS", 44.9130555556, 9.72333333333), - ("LIMW", 45.7383333333, 7.36777777778), - ("LIMZ", 44.5463888889, 7.62222222222), - ("LIPA", 46.0316666667, 12.5963888889), - ("LIPB", 46.4605555556, 11.3261111111), - ("LIPC", 44.2236111111, 12.3061111111), - ("LIPE", 44.5341666667, 11.2902777778), - ("LIPH", 45.6486111111, 12.1952777778), - ("LIPI", 45.9805555556, 13.0544444444), - ("LIPK", 44.1947222222, 12.07), - ("LIPL", 45.4319444444, 10.2675), - ("LIPN", 45.4719444444, 10.9277777778), - ("LIPO", 45.4288888889, 10.3305555556), - ("LIPQ", 45.8277777778, 13.4663888889), - ("LIPR", 44.0202777778, 12.6119444444), - ("LIPS", 45.6844444444, 12.0861111111), - ("LIPT", 45.5741666667, 11.5305555556), - ("LIPU", 45.3955555556, 11.8477777778), - ("LIPX", 45.3955555556, 10.8883333333), - ("LIPZ", 45.505, 12.3516666667), - ("LIQS", 43.2572222222, 11.2541666667), - ("LIRA", 41.7991666667, 12.5947222222), - ("LIRE", 41.6536111111, 12.4444444444), - ("LIRF", 41.8127777778, 12.2530555556), - ("LIRG", 41.9902777778, 12.7408333333), - ("LIRI", 40.6202777778, 14.9111111111), - ("LIRJ", 42.7602777778, 10.2394444444), - ("LIRL", 41.5422222222, 12.9088888889), - ("LIRM", 41.0608333333, 14.0819444444), - ("LIRN", 40.8858333333, 14.2905555556), - ("LIRP", 43.6838888889, 10.3925), - ("LIRQ", 43.8097222222, 11.205), - ("LIRS", 42.7608333333, 11.0722222222), - ("LIRU", 41.9519444444, 12.4988888889), - ("LIRV", 42.4302777778, 12.0641666667), - ("LIRZ", 43.0958333333, 12.5130555556), - ("LJCE", 45.8997222222, 15.53), - ("LJLJ", 46.2236111111, 14.4575), - ("LJMB", 46.4797222222, 15.6861111111), - ("LJPZ", 45.4733333333, 13.6147222222), - ("LJSG", 46.4719444444, 15.1169444444), - ("LKCS", 48.9461111111, 14.4272222222), - ("LKCT", 49.6844444444, 15.6761111111), - ("LKCV", 49.9394444444, 15.3816666667), - ("LKHK", 50.2530555556, 15.845), - ("LKKB", 50.1211111111, 14.5436111111), - ("LKKU", 49.0294444444, 17.4397222222), - ("LKKV", 50.2027777778, 12.9147222222), - ("LKLN", 49.675, 13.2744444444), - ("LKMH", 50.54, 15.0063888889), - ("LKMT", 49.6963888889, 18.1111111111), - ("LKNA", 49.1658333333, 16.1247222222), - ("LKPD", 50.0133333333, 15.7386111111), - ("LKPM", 49.7186111111, 14.0969444444), - ("LKPO", 49.4258333333, 17.4047222222), - ("LKPR", 50.1008333333, 14.26), - ("LKSO", 49.2447222222, 14.7136111111), - ("LKTB", 49.1511111111, 16.6941666667), - ("LKVO", 50.2163888889, 14.3955555556), - ("LLBG", 32.0094444444, 34.8766666667), - ("LLBS", 31.2869444444, 34.7227777778), - ("LLEK", 31.8394444444, 34.8216666667), - ("LLES", 32.4408333333, 35.0061111111), - ("LLET", 29.5611111111, 34.96), - ("LLEY", 30.6230555556, 35.2019444444), - ("LLHA", 32.8111111111, 35.0438888889), - ("LLHS", 31.7625, 34.7272222222), - ("LLIB", 32.9808333333, 35.5716666667), - ("LLJR", 31.8666666667, 35.2166666667), - ("LLLL", 31.2286111111, 35.1908333333), - ("LLMG", 32.5986111111, 35.2283333333), - ("LLMZ", 31.3280555556, 35.3883333333), - ("LLNV", 31.2083333333, 35.0122222222), - ("LLOV", 29.94, 34.9358333333), - ("LLRD", 32.6602777778, 35.1822222222), - ("LLRM", 30.7761111111, 34.6666666667), - ("LLSD", 32.1144444444, 34.7819444444), - ("LMML", 35.8572222222, 14.4775), - ("LMMM", 35.9166666667, 14.4166666667), - ("LOAN", 47.8433333333, 16.26), - ("LOLW", 48.1830555556, 14.0408333333), - ("LOWG", 47.0, 15.4333333333), - ("LOWI", 47.26, 11.3438888889), - ("LOWK", 46.65, 14.3333333333), - ("LOWL", 48.2333333333, 14.1833333333), - ("LOWM", 48.0, 16.5), - ("LOWS", 47.7930555556, 13.0041666667), - ("LOWW", 48.1102777778, 16.5697222222), - ("LOXG", 46.9908333333, 15.4394444444), - ("LOXK", 46.6425, 14.3375), - ("LOXL", 48.2330555556, 14.1875), - ("LOXT", 48.3208333333, 16.1116666667), - ("LOXZ", 47.2027777778, 14.7441666667), - ("LPAR", 38.8830555556, -9.03), - ("LPAZ", 36.9713888889, -25.1705555556), - ("LPBG", 41.8683333333, -6.71194444444), - ("LPBJ", 38.0788888889, -7.93222222222), - ("LPBR", 41.5869444444, -8.445), - ("LPCO", 40.1572222222, -8.47), - ("LPCS", 38.725, -9.355), - ("LPCV", 40.2647222222, -7.47972222222), - ("LPEV", 38.5333333333, -7.88944444444), - ("LPFL", 39.455, -31.1311111111), - ("LPFR", 37.0141666667, -7.96583333333), - ("LPGR", 39.0919444444, -28.0297222222), - ("LPHR", 38.5197222222, -28.7158333333), - ("LPIN", 40.9741666667, -8.64527777778), - ("LPLA", 38.7641666667, -27.0933333333), - ("LPMG", 38.7166666667, -9.15583333333), - ("LPMR", 39.8311111111, -8.88722222222), - ("LPMT", 38.7036111111, -9.03583333333), - ("LPOV", 40.9158333333, -8.64583333333), - ("LPPD", 37.7411111111, -25.6977777778), - ("LPPI", 38.5544444444, -28.4397222222), - ("LPPM", 37.1491666667, -8.58388888889), - ("LPPR", 41.2480555556, -8.68138888889), - ("LPPS", 33.0733333333, -16.3497222222), - ("LPPT", 38.7811111111, -9.13583333333), - ("LPSJ", 38.6652777778, -28.1755555556), - ("LPST", 38.8308333333, -9.33944444444), - ("LPTN", 39.475, -8.36444444444), - ("LPVR", 41.2741666667, -7.72027777778), - ("LPVZ", 40.7252777778, -7.88888888889), - ("LQBK", 44.9413888889, 17.2975), - ("LQMO", 43.2827777778, 17.8458333333), - ("LQSA", 43.8244444444, 18.3313888889), - ("LRAR", 46.1763888889, 21.2619444444), - ("LRBC", 46.5219444444, 26.9102777778), - ("LRBM", 47.6583333333, 23.47), - ("LRBS", 44.5030555556, 26.1019444444), - ("LRCK", 44.3622222222, 28.4883333333), - ("LRCL", 46.785, 23.6861111111), - ("LRCS", 45.42, 22.2533333333), - ("LRCV", 44.3180555556, 23.8886111111), - ("LRIA", 47.1788888889, 27.62), - ("LROD", 47.0252777778, 21.9025), - ("LROP", 44.5736111111, 26.1033333333), - ("LRSB", 45.7855555556, 24.0911111111), - ("LRSM", 47.7033333333, 22.8855555556), - ("LRSV", 47.6875, 26.3538888889), - ("LRTC", 45.0622222222, 28.7141666667), - ("LRTM", 46.4675, 24.4125), - ("LRTR", 45.81, 21.3377777778), - ("LSAZ", 46.6136111111, 7.67777777778), - ("LSGC", 47.0836111111, 6.79277777778), - ("LSGG", 46.2380555556, 6.10888888889), - ("LSGK", 46.4875, 7.25083333333), - ("LSGS", 46.2194444444, 7.32666666667), - ("LSMA", 46.9438888889, 8.28416666667), - ("LSMC", 46.5011111111, 8.29555555556), - ("LSMD", 47.3986111111, 8.64805555556), - ("LSME", 47.0922222222, 8.305), - ("LSMF", 47.0786111111, 9.06472222222), - ("LSMI", 46.6763888889, 7.87916666667), - ("LSMJ", 46.3038888889, 7.71444444444), - ("LSMM", 46.7433333333, 8.11), - ("LSMN", 46.3036111111, 7.82333333333), - ("LSMP", 46.8430555556, 6.915), - ("LSMU", 46.9747222222, 8.39888888889), - ("LSSW", 47.3833333333, 8.56666666667), - ("LSZA", 46.0041666667, 8.91055555556), - ("LSZB", 46.9138888889, 7.49694444444), - ("LSZG", 47.1813888889, 7.41694444444), - ("LSZH", 47.4647222222, 8.54916666667), - ("LSZR", 47.485, 9.56055555556), - ("LSZS", 46.5325, 9.88277777778), - ("LTAA", 40.0, 32.0), - ("LTAB", 39.9347222222, 32.7405555556), - ("LTAC", 40.1280555556, 32.995), - ("LTAD", 39.9497222222, 32.6886111111), - ("LTAE", 40.0788888889, 32.5655555556), - ("LTAF", 36.9819444444, 35.2802777778), - ("LTAG", 37.0019444444, 35.4258333333), - ("LTAH", 38.7261111111, 30.6011111111), - ("LTAI", 36.9013888889, 30.7916666667), - ("LTAJ", 36.9480555556, 37.4791666667), - ("LTAK", 36.5733333333, 36.1538888889), - ("LTAL", 41.3138888889, 33.7958333333), - ("LTAN", 37.9788888889, 32.5616666667), - ("LTAP", 40.8291666667, 35.5219444444), - ("LTAQ", 41.2763888889, 36.3036111111), - ("LTAR", 39.8136111111, 36.9033333333), - ("LTAS", 41.5158333333, 32.0997222222), - ("LTAT", 38.4358333333, 38.0916666667), - ("LTAU", 38.7702777778, 35.4952777778), - ("LTAV", 39.4513888889, 31.3652777778), - ("LTAW", 40.305, 36.3677777778), - ("LTAX", 41.2544444444, 31.415), - ("LTAY", 37.785, 29.7011111111), - ("LTAZ", 38.7716666667, 34.5341666667), - ("LTBA", 40.9766666667, 28.8211111111), - ("LTBD", 37.8158333333, 27.8861111111), - ("LTBE", 40.2316666667, 29.0091666667), - ("LTBF", 39.6188888889, 27.9247222222), - ("LTBG", 40.3177777778, 27.9775), - ("LTBH", 40.1375, 26.4266666667), - ("LTBI", 39.7838888889, 30.5819444444), - ("LTBJ", 38.2922222222, 27.1569444444), - ("LTBK", 38.3191666667, 27.1597222222), - ("LTBL", 38.5130555556, 27.01), - ("LTBM", 37.7852777778, 30.5816666667), - ("LTBN", 39.4266666667, 30.0163888889), - ("LTBO", 38.6811111111, 29.4713888889), - ("LTBP", 40.6833333333, 29.3786111111), - ("LTBQ", 40.735, 30.0830555556), - ("LTBR", 40.255, 29.5625), - ("LTBS", 36.7130555556, 28.7925), - ("LTBT", 38.8086111111, 27.8336111111), - ("LTBU", 41.1380555556, 27.9188888889), - ("LTBX", 40.9927777778, 29.2163888889), - ("LTBY", 39.8097222222, 30.5194444444), - ("LTCA", 38.6066666667, 39.2913888889), - ("LTCC", 37.8936111111, 40.2005555556), - ("LTCD", 39.71, 39.5261111111), - ("LTCE", 39.9563888889, 41.17), - ("LTCF", 40.5622222222, 43.115), - ("LTCG", 40.995, 39.7897222222), - ("LTCH", 37.0919444444, 38.8461111111), - ("LTCI", 38.4680555556, 43.3322222222), - ("LTCJ", 37.9288888889, 41.1161111111), - ("LTCK", 38.7544444444, 41.6611111111), - ("LTCL", 37.9786111111, 41.8402777778), - ("LTCM", 42.0188888889, 35.0791666667), - ("LTFA", 38.5175, 26.9772222222), - ("LTFB", 37.9505555556, 27.3288888889), - ("LUBL", 47.8377777778, 27.7811111111), - ("LUKK", 46.9277777778, 28.9313888889), - ("LWOH", 41.1797222222, 20.7422222222), - ("LWSK", 41.9613888889, 21.6213888889), - ("LXGB", 36.1508333333, -5.34944444444), - ("LYBE", 44.8183333333, 20.3088888889), - ("LYPG", 42.3591666667, 19.2516666667), - ("LYPR", 42.5727777778, 21.0358333333), - ("LYTV", 42.4044444444, 18.7230555556), - ("LYVR", 45.1466666667, 21.3097222222), - ("LZIB", 48.17, 17.2125), - ("LZKZ", 48.6630555556, 21.2411111111), - ("LZMC", 48.4019444444, 17.1183333333), - ("LZPP", 48.625, 17.8283333333), - ("LZSL", 48.6377777778, 19.1338888889), - ("LZTN", 48.865, 17.9922222222), - ("LZTT", 49.0733333333, 20.2408333333), - ("LZZI", 49.2316666667, 18.6136111111), - ("MBNC", 21.9172222222, -71.9394444444), - ("MBPV", 21.7736111111, -72.2658333333), - ("MBSC", 21.5155555556, -71.5283333333), - ("MDAB", 19.1986111111, -69.43), - ("MDBH", 18.2513888889, -71.1202777778), - ("MDCR", 17.9288888889, -71.6447222222), - ("MDCZ", 18.9080555556, -70.72), - ("MDHE", 18.4711111111, -69.9688888889), - ("MDLR", 18.4519444444, -68.9116666667), - ("MDPC", 18.5672222222, -68.3633333333), - ("MDPP", 19.7572222222, -70.5697222222), - ("MDSD", 18.4294444444, -69.6686111111), - ("MDSI", 18.5036111111, -69.7616666667), - ("MDST", 19.4091666667, -70.6163888889), - ("MGBN", 15.4733333333, -88.8372222222), - ("MGCB", 15.4688888889, -90.4066666667), - ("MGGT", 14.5830555556, -90.5275), - ("MGPB", 15.7308333333, -88.5836111111), - ("MGPP", 16.3261111111, -89.4169444444), - ("MGQZ", 14.8652777778, -91.5019444444), - ("MGRT", 14.5208333333, -91.6972222222), - ("MGSJ", 13.9361111111, -90.8358333333), - ("MHIC", 17.4072222222, -83.9325), - ("MHLC", 15.7422222222, -86.8533333333), - ("MHLM", 15.4525, -87.9233333333), - ("MHNJ", 16.4452777778, -85.9063888889), - ("MHPL", 15.2608333333, -83.7813888889), - ("MHRO", 16.3166666667, -86.5225), - ("MHTE", 15.7758333333, -87.4755555556), - ("MHTG", 14.0608333333, -87.2169444444), - ("MHTJ", 15.9266666667, -85.9380555556), - ("MKBS", 18.4041666667, -76.9688888889), - ("MKJP", 17.9355555556, -76.7875), - ("MKJS", 18.5036111111, -77.9133333333), - ("MKKJ", 18.1986111111, -76.5344444444), - ("MKTP", 17.9883333333, -76.8236111111), - ("MMAA", 16.7566666667, -99.7533333333), - ("MMAN", 25.8655555556, -100.237222222), - ("MMAS", 21.7052777778, -102.317777778), - ("MMBT", 15.7747222222, -96.2608333333), - ("MMCB", 18.835, -99.2619444444), - ("MMCC", 29.3319444444, -100.980833333), - ("MMCE", 18.6536111111, -91.7988888889), - ("MMCG", 30.3972222222, -107.874722222), - ("MMCH", 17.5736111111, -99.5141666667), - ("MMCL", 24.7644444444, -107.474444444), - ("MMCM", 18.5044444444, -88.3266666667), - ("MMCN", 27.3925, -109.833055556), - ("MMCP", 19.8166666667, -90.5002777778), - ("MMCS", 31.6361111111, -106.428611111), - ("MMCU", 28.7027777778, -105.964444444), - ("MMCV", 23.7038888889, -98.9563888889), - ("MMCY", 20.5458333333, -100.886388889), - ("MMCZ", 20.5222222222, -86.9255555556), - ("MMDM", 22.7402777778, -99.0180555556), - ("MMDO", 24.1241666667, -104.527777778), - ("MMEP", 21.4194444444, -104.8425), - ("MMES", 31.7952777778, -116.6025), - ("MMGL", 20.5216666667, -103.311111111), - ("MMGM", 27.9688888889, -110.925), - ("MMHC", 18.4969444444, -97.4197222222), - ("MMHO", 29.0958333333, -111.047777778), - ("MMIA", 19.2769444444, -103.577222222), - ("MMIM", 21.245, -86.7397222222), - ("MMIO", 25.5494444444, -100.928611111), - ("MMIT", 16.4491666667, -95.0936111111), - ("MMJA", 19.475, -96.7975), - ("MMLC", 18.0016666667, -102.220277778), - ("MMLM", 25.685, -109.080555556), - ("MMLO", 20.9933333333, -101.480833333), - ("MMLP", 24.0725, -110.362222222), - ("MMLT", 25.9891666667, -111.348333333), - ("MMMA", 25.7697222222, -97.5252777778), - ("MMMD", 20.9369444444, -89.6575), - ("MMML", 32.6305555556, -115.241388889), - ("MMMM", 19.8497222222, -101.025277778), - ("MMMT", 18.1033333333, -94.5805555556), - ("MMMV", 26.9555555556, -101.47), - ("MMMX", 19.4361111111, -99.0719444444), - ("MMMY", 25.7783333333, -100.106666667), - ("MMMZ", 23.1611111111, -106.265833333), - ("MMNG", 31.2258333333, -110.975555556), - ("MMNL", 27.4438888889, -99.5702777778), - ("MMOX", 16.9997222222, -96.7263888889), - ("MMPA", 20.6025, -97.4608333333), - ("MMPB", 19.1580555556, -98.3713888889), - ("MMPC", 20.0772222222, -98.7822222222), - ("MMPE", 31.3516666667, -113.525555556), - ("MMPG", 28.6272222222, -100.535), - ("MMPN", 19.3966666667, -102.039166667), - ("MMPR", 20.68, -105.254166667), - ("MMPS", 15.8766666667, -97.0888888889), - ("MMQT", 20.6238888889, -100.368611111), - ("MMRX", 26.0088888889, -98.2283333333), - ("MMSD", 23.1516666667, -109.720833333), - ("MMSF", 30.93, -114.808611111), - ("MMSP", 22.2541666667, -100.930555556), - ("MMTA", 19.5363888889, -98.1733333333), - ("MMTC", 25.5680555556, -103.410555556), - ("MMTG", 16.7694444444, -93.3413888889), - ("MMTJ", 32.5408333333, -116.97), - ("MMTM", 22.2963888889, -97.8658333333), - ("MMTN", 22.0380555556, -98.8063888889), - ("MMTO", 19.3369444444, -99.5658333333), - ("MMTP", 14.7941666667, -92.37), - ("MMTX", 19.5983333333, -103.371944444), - ("MMUN", 21.0363888889, -86.8769444444), - ("MMVA", 17.9969444444, -92.8172222222), - ("MMVR", 19.1452777778, -96.1869444444), - ("MMZC", 22.8969444444, -102.686666667), - ("MMZH", 17.6013888889, -101.460277778), - ("MMZM", 20.045, -102.275833333), - ("MMZO", 19.1447222222, -104.558611111), - ("MMZP", 20.7558333333, -103.465277778), - ("MNBL", 11.9888888889, -83.7741666667), - ("MNBR", 12.1894444444, -86.3538888889), - ("MNLN", 12.4277777778, -86.9022222222), - ("MNMG", 12.1411111111, -86.1680555556), - ("MNPC", 14.0469444444, -83.3866666667), - ("MPBO", 9.34083333333, -82.2508333333), - ("MPCH", 9.45861111111, -82.5166666667), - ("MPDA", 8.39083333333, -82.4347222222), - ("MPHO", 8.91444444444, -79.5994444444), - ("MPJE", 7.51722222222, -78.1566666667), - ("MPLP", 8.40666666667, -78.1416666667), - ("MPMG", 8.97333333333, -79.5555555556), - ("MPSA", 8.08555555556, -80.945), - ("MPTO", 9.07111111111, -79.3833333333), - ("MRBA", 9.16694444444, -83.3325), - ("MRBC", 10.7686111111, -83.5858333333), - ("MRCC", 8.60111111111, -82.97), - ("MRCV", 10.3555555556, -85.8527777778), - ("MREC", 10.2019444444, -83.4719444444), - ("MRFI", 8.91611111111, -83.5072222222), - ("MRFS", 8.6525, -83.0652777778), - ("MRGF", 8.65388888889, -83.1819444444), - ("MRGP", 10.2172222222, -83.7947222222), - ("MRLB", 10.5930555556, -85.5441666667), - ("MRLC", 11.0352777778, -84.7061111111), - ("MRLM", 9.95777777778, -83.0219444444), - ("MRNS", 9.97638888889, -85.6527777778), - ("MROC", 9.99361111111, -84.2086111111), - ("MRPD", 9.73194444444, -82.9830555556), - ("MRPM", 8.95083333333, -83.4683333333), - ("MRPV", 9.95722222222, -84.1419444444), - ("MRQP", 9.44305555556, -84.1297222222), - ("MRSG", 10.2883333333, -83.7136111111), - ("MRSV", 8.82611111111, -82.9588888889), - ("MSLP", 13.4405555556, -89.0558333333), - ("MSSS", 13.7, -89.12), - ("MTCH", 19.7325, -72.1947222222), - ("MTPP", 18.58, -72.2925), - ("MUBA", 20.3655555556, -74.5063888889), - ("MUBY", 20.3963888889, -76.6213888889), - ("MUCA", 22.0269444444, -78.7894444444), - ("MUCB", 22.5063888889, -79.4697222222), - ("MUCC", 22.4611111111, -78.3286111111), - ("MUCF", 22.15, -80.4141666667), - ("MUCL", 21.6161111111, -81.5455555556), - ("MUCM", 21.4202777778, -77.8475), - ("MUCU", 19.97, -75.8355555556), - ("MUFL", 21.4997222222, -78.2027777778), - ("MUGM", 19.9063888889, -75.2069444444), - ("MUGT", 20.0852777778, -75.1583333333), - ("MUHA", 22.9891666667, -82.4091666667), - ("MUHG", 20.7855555556, -76.315), - ("MULM", 22.3358333333, -83.6419444444), - ("MUMG", 22.9697222222, -82.2747222222), - ("MUML", 23.0072222222, -82.7675), - ("MUMO", 20.6541666667, -74.9216666667), - ("MUMZ", 20.2880555556, -77.0891666667), - ("MUNC", 20.6886111111, -75.5313888889), - ("MUNG", 21.8347222222, -82.7838888889), - ("MUPB", 23.0327777778, -82.5794444444), - ("MUPR", 22.4211111111, -83.6775), - ("MUSA", 22.8713888889, -82.5091666667), - ("MUSC", 22.4919444444, -79.9436111111), - ("MUSJ", 22.0952777778, -84.1519444444), - ("MUSL", 21.5094444444, -77.0175), - ("MUSN", 21.6425, -82.955), - ("MUSS", 21.9705555556, -79.4422222222), - ("MUTD", 21.7883333333, -79.9972222222), - ("MUVR", 23.0344444444, -81.4352777778), - ("MUVT", 20.9877777778, -76.9358333333), - ("MWCB", 19.6866666667, -79.8827777778), - ("MWCR", 19.2927777778, -81.3575), - ("MYAB", 24.2875, -77.6844444444), - ("MYAF", 24.6977777778, -77.7955555556), - ("MYAK", 24.1586111111, -77.5897222222), - ("MYAM", 26.5113888889, -77.0833333333), - ("MYAN", 25.0536111111, -78.0488888889), - ("MYAP", 22.4416666667, -73.9708333333), - ("MYAS", 26.0044444444, -77.3952777778), - ("MYAT", 26.7452777778, -77.3911111111), - ("MYBC", 25.4169444444, -77.8808333333), - ("MYBG", 25.7380555556, -77.84), - ("MYBS", 25.6997222222, -79.2644444444), - ("MYCA", 24.6291666667, -75.6736111111), - ("MYCB", 24.315, -75.4538888889), - ("MYCI", 22.7455555556, -74.1822222222), - ("MYEF", 23.5625, -75.8777777778), - ("MYEH", 25.4755555556, -76.6811111111), - ("MYEM", 25.2844444444, -76.3308333333), - ("MYEN", 24.5944444444, -76.8319444444), - ("MYER", 24.8916666667, -76.1775), - ("MYES", 24.1688888889, -76.4388888889), - ("MYGF", 26.5586111111, -78.6952777778), - ("MYGW", 26.6861111111, -78.9775), - ("MYIG", 20.975, -73.6666666667), - ("MYLD", 23.1788888889, -75.0933333333), - ("MYLS", 23.5827777778, -75.2686111111), - ("MYMM", 22.3794444444, -73.0133333333), - ("MYNN", 25.0388888889, -77.4661111111), - ("MYRD", 22.1816666667, -75.7294444444), - ("MYSM", 24.0630555556, -74.5238888889), - ("MZBZ", 17.5388888889, -88.3080555556), - ("NCAI", -18.825, -159.773611111), - ("NCRG", -21.2025, -159.805555556), - ("NFFN", -17.7544444444, 177.443333333), - ("NFNA", -18.0430555556, 178.559166667), - ("NFNL", -16.4666666667, 179.339722222), - ("NFTF", -21.2408333333, -175.15), - ("NFTL", -19.7769444444, -174.341111111), - ("NFTV", -18.5852777778, -173.962777778), - ("NGFU", -8.51666666667, 179.216666667), - ("NGTA", 1.38138888889, 173.146944444), - ("NGTE", -1.22361111111, 174.776111111), - ("NIUE", -19.08, -169.925555556), - ("NLWW", -13.2380555556, -176.199166667), - ("NSFA", -13.8297222222, -172.008333333), - ("NSTU", -14.3308333333, -170.710277778), - ("NTAR", -22.4338888889, -151.360555556), - ("NTAT", -23.3652777778, -149.523888889), - ("NTGA", -17.3525, -145.509722222), - ("NTGB", -15.8197222222, -140.886944444), - ("NTGC", -15.1194444444, -148.230555556), - ("NTGE", -18.4658333333, -136.439444444), - ("NTGF", -16.0544444444, -145.656944444), - ("NTGI", -14.4366666667, -146.07), - ("NTGJ", -23.0797222222, -134.890277778), - ("NTGK", -15.6633333333, -146.884722222), - ("NTGM", -16.5847222222, -143.657222222), - ("NTGN", -14.1766666667, -141.267222222), - ("NTGP", -14.8094444444, -138.812777778), - ("NTGT", -14.7125, -145.252777778), - ("NTGU", -15.2480555556, -146.616388889), - ("NTGV", -14.8680555556, -148.717222222), - ("NTGY", -20.7833333333, -138.567777778), - ("NTKR", -14.4555555556, -145.024444444), - ("NTMD", -8.79555555556, -140.228611111), - ("NTMN", -9.76861111111, -139.011111111), - ("NTTB", -16.4441666667, -151.751111111), - ("NTTG", -14.9541666667, -147.660555556), - ("NTTH", -16.6872222222, -151.021666667), - ("NTTM", -17.4897222222, -149.761666667), - ("NTTO", -18.0747222222, -140.945833333), - ("NTTP", -16.4263888889, -152.243611111), - ("NTTR", -16.7227777778, -151.465833333), - ("NTTX", -21.8083333333, -138.794166667), - ("NVSS", -15.5011111111, 167.2225), - ("NVVV", -17.6991666667, 168.319722222), - ("NWWD", -21.0533333333, 164.837777778), - ("NWWK", -20.5461111111, 164.255555556), - ("NWWL", -20.7747222222, 167.239722222), - ("NWWM", -22.2580555556, 166.472777778), - ("NWWR", -21.4816666667, 168.0375), - ("NWWU", -20.7911111111, 165.259166667), - ("NWWV", -20.6405555556, 166.572777778), - ("NWWW", -22.0144444444, 166.212777778), - ("NZAA", -37.0080555556, 174.791666667), - ("NZAP", -38.7397222222, 176.084444444), - ("NZAR", -37.0297222222, 174.973333333), - ("NZCH", -43.4891666667, 172.532222222), - ("NZCI", -43.81, -176.457222222), - ("NZDN", -45.9280555556, 170.198333333), - ("NZGS", -38.6633333333, 177.978333333), - ("NZGT", -43.9066666667, 170.128333333), - ("NZHK", -42.7136111111, 170.985277778), - ("NZHN", -37.8663888889, 175.331944444), - ("NZHS", -39.6466666667, 176.766944444), - ("NZKK", -35.2627777778, 173.911944444), - ("NZKT", -35.07, 173.285277778), - ("NZLX", -45.2116666667, 169.373333333), - ("NZMC", -43.765, 170.133333333), - ("NZMO", -45.5330555556, 167.65), - ("NZMS", -40.9733333333, 175.633611111), - ("NZNP", -39.0086111111, 174.179166667), - ("NZNS", -41.2983333333, 173.221111111), - ("NZNV", -46.4122222222, 168.312777778), - ("NZOH", -40.2058333333, 175.387777778), - ("NZOU", -44.97, 171.081666667), - ("NZPM", -40.3205555556, 175.616944444), - ("NZPP", -40.9047222222, 174.989166667), - ("NZQN", -45.0211111111, 168.739166667), - ("NZRO", -38.1091666667, 176.317222222), - ("NZRU", -39.4463888889, 175.658333333), - ("NZSP", -89.9997222222, 0.0), - ("NZTG", -37.6719444444, 176.196111111), - ("NZTU", -44.3027777778, 171.225277778), - ("NZUK", -44.235, 170.118333333), - ("NZWB", -41.5183333333, 173.870277778), - ("NZWD", -77.8833333333, 166.65), - ("NZWF", -44.7252777778, 169.243055556), - ("NZWG", -43.5511111111, 172.552777778), - ("NZWK", -37.9205555556, 176.914166667), - ("NZWN", -41.3272222222, 174.805277778), - ("NZWO", -39.0069444444, 177.406666667), - ("NZWP", -36.7877777778, 174.630277778), - ("NZWR", -35.7683333333, 174.365), - ("NZWS", -41.7380555556, 171.580833333), - ("NZWU", -39.9622222222, 175.025277778), - ("OAHR", 34.2097222222, 62.2277777778), - ("OAJL", 34.3991666667, 70.4994444444), - ("OAKB", 34.5658333333, 69.2122222222), - ("OAKN", 31.5058333333, 65.8477777778), - ("OAMN", 35.9341666667, 64.7591666667), - ("OAMS", 36.7069444444, 67.2091666667), - ("OASD", 33.3911111111, 62.2608333333), - ("OASG", 36.7502777778, 65.9122222222), - ("OATQ", 36.775, 69.5325), - ("OAUZ", 36.665, 68.9108333333), - ("OBBI", 26.2708333333, 50.6336111111), - ("OBBS", 25.9183333333, 50.5905555556), - ("OEAB", 18.24, 42.6555555556), - ("OEAH", 25.2841666667, 49.4861111111), - ("OEBA", 20.2961111111, 41.6341666667), - ("OEBH", 19.9838888889, 42.6227777778), - ("OEBQ", 25.9113888889, 49.5913888889), - ("OEDF", 26.4711111111, 49.7977777778), - ("OEDR", 26.2652777778, 50.1519444444), - ("OEGN", 16.9011111111, 42.5858333333), - ("OEGS", 26.3027777778, 43.7744444444), - ("OEGT", 31.4108333333, 37.2788888889), - ("OEHL", 27.4377777778, 41.6861111111), - ("OEJB", 27.0388888889, 49.405), - ("OEJF", 21.3480555556, 39.1727777778), - ("OEJN", 21.6794444444, 39.1563888889), - ("OEKK", 27.9008333333, 45.5280555556), - ("OEMA", 24.5533333333, 39.705), - ("OENG", 17.6113888889, 44.4191666667), - ("OEPA", 28.335, 46.125), - ("OEPC", 25.1744444444, 47.4883333333), - ("OEPF", 24.7102777778, 44.9644444444), - ("OEPJ", 24.1072222222, 41.0358333333), - ("OERB", 22.7025, 39.0697222222), - ("OERF", 29.6263888889, 43.4905555556), - ("OERK", 24.9575, 46.6986111111), - ("OERM", 28.0794444444, 48.6108333333), - ("OERR", 30.9072222222, 41.1383333333), - ("OERT", 26.7230555556, 50.0305555556), - ("OESH", 17.4666666667, 47.1211111111), - ("OESK", 29.785, 40.1), - ("OESL", 20.4647222222, 45.6194444444), - ("OETB", 28.3652777778, 36.6188888889), - ("OETF", 21.4833333333, 40.5441666667), - ("OETH", 25.2141666667, 46.6405555556), - ("OETN", 27.8688888889, 48.7683333333), - ("OETR", 31.6925, 38.7311111111), - ("OEWD", 20.5041666667, 45.1994444444), - ("OEWJ", 26.1975, 36.4761111111), - ("OEYN", 24.1441666667, 38.0633333333), - ("OIAA", 30.365, 48.2330555556), - ("OIAD", 32.4344444444, 48.3975), - ("OIAG", 30.7452777778, 49.6761111111), - ("OIAH", 30.3375, 50.8277777778), - ("OIAI", 32.0022222222, 49.2705555556), - ("OIAJ", 30.835, 49.5347222222), - ("OIAM", 30.5561111111, 49.1516666667), - ("OIAW", 31.3372222222, 48.7619444444), - ("OIBA", 25.8758333333, 55.0327777778), - ("OIBB", 28.9447222222, 50.8344444444), - ("OIBH", 27.2125, 54.3183333333), - ("OIBI", 27.4838888889, 52.6183333333), - ("OIBK", 26.5266666667, 53.9816666667), - ("OIBL", 26.5316666667, 54.8216666667), - ("OIBQ", 29.2591666667, 50.3238888889), - ("OIBS", 25.9094444444, 54.5391666667), - ("OIBV", 26.81, 53.3563888889), - ("OICC", 34.3463888889, 47.1563888889), - ("OICD", 32.9344444444, 47.4833333333), - ("OICI", 33.5855555556, 46.4052777778), - ("OICK", 33.4363888889, 48.2858333333), - ("OICS", 35.2469444444, 47.0069444444), - ("OIFE", 32.9294444444, 51.5608333333), - ("OIFH", 32.5669444444, 51.6913888889), - ("OIFM", 32.7505555556, 51.8616666667), - ("OIFP", 32.6208333333, 51.6966666667), - ("OIGG", 37.3252777778, 49.6055555556), - ("OIHH", 34.8680555556, 48.5522222222), - ("OIHR", 34.1402777778, 49.8483333333), - ("OIID", 35.7027777778, 51.475), - ("OIIG", 35.6447222222, 51.3805555556), - ("OIII", 35.6891666667, 51.3133333333), - ("OIIK", 36.2413888889, 50.0475), - ("OIIS", 35.5908333333, 53.495), - ("OIKB", 27.2180555556, 56.3777777778), - ("OIKJ", 28.7266666667, 57.67), - ("OIKK", 30.2611111111, 56.9566666667), - ("OIKM", 29.0838888889, 58.4502777778), - ("OIKP", 27.1580555556, 56.1722222222), - ("OIKQ", 26.755, 55.9019444444), - ("OIKR", 30.2977777778, 56.0519444444), - ("OIKY", 29.5508333333, 55.6725), - ("OIMB", 32.8955555556, 59.2755555556), - ("OIMC", 36.5011111111, 61.0647222222), - ("OIMJ", 36.4236111111, 55.1058333333), - ("OIMN", 37.4930555556, 57.3005555556), - ("OIMT", 33.6677777778, 56.8925), - ("OIMX", 37.6277777778, 56.1730555556), - ("OINE", 37.3830555556, 55.4519444444), - ("OING", 36.9091666667, 54.4016666667), - ("OINM", 34.1691666667, 51.3175), - ("OINN", 36.6633333333, 51.4647222222), - ("OINR", 36.9097222222, 50.6794444444), - ("OINZ", 36.6436111111, 53.1883333333), - ("OISD", 28.7213888889, 54.4411111111), - ("OISF", 28.8919444444, 53.7227777778), - ("OISJ", 28.5863888889, 53.5788888889), - ("OISL", 27.6736111111, 54.3813888889), - ("OISO", 29.7541666667, 52.6941666667), - ("OISR", 27.3708333333, 53.1891666667), - ("OISS", 29.5391666667, 52.5894444444), - ("OITL", 38.3261111111, 48.4241666667), - ("OITM", 37.3486111111, 46.1261111111), - ("OITP", 39.6036111111, 47.8811111111), - ("OITT", 38.1327777778, 46.2347222222), - ("OITZ", 36.7741666667, 48.3597222222), - ("OIYY", 31.9047222222, 54.2763888889), - ("OIZB", 31.0969444444, 61.5438888889), - ("OIZC", 25.4433333333, 60.3819444444), - ("OIZH", 29.4761111111, 60.9058333333), - ("OIZI", 27.2363888889, 60.72), - ("OIZJ", 25.6533333333, 57.7991666667), - ("OJAI", 31.7225, 35.9930555556), - ("OJAM", 31.9725, 35.9913888889), - ("OJAQ", 29.6113888889, 35.0180555556), - ("OJJR", 31.8647222222, 35.2191666667), - ("OJMF", 32.3561111111, 36.2591666667), - ("OKBK", 29.2266666667, 47.98), - ("OLBA", 33.8133333333, 35.4886111111), - ("OLKA", 34.5891666667, 36.0111111111), - ("OMAA", 24.4327777778, 54.6511111111), - ("OMAD", 24.4283333333, 54.4580555556), - ("OMAH", 24.0736111111, 52.4633333333), - ("OMAJ", 24.1872222222, 52.6138888889), - ("OMAL", 24.2616666667, 55.6091666667), - ("OMAM", 24.2480555556, 54.5475), - ("OMAR", 24.7802777778, 52.5597222222), - ("OMAS", 25.1461111111, 52.8736111111), - ("OMAZ", 24.8613888889, 53.0777777778), - ("OMDB", 25.2547222222, 55.3641666667), - ("OMFJ", 25.1122222222, 56.3238888889), - ("OMRK", 25.6133333333, 55.9386111111), - ("OMSJ", 25.3283333333, 55.5169444444), - ("OOKB", 26.1711111111, 56.2405555556), - ("OOMA", 20.6752777778, 58.8902777778), - ("OOMS", 23.5930555556, 58.2844444444), - ("OOSA", 17.0386111111, 54.0911111111), - ("OOSQ", 23.0666666667, 57.65), - ("OOTH", 17.6658333333, 54.0244444444), - ("OPBN", 32.9719444444, 70.5247222222), - ("OPBW", 29.3469444444, 71.7113888889), - ("OPCH", 35.8863888889, 71.8005555556), - ("OPDB", 28.8747222222, 64.4044444444), - ("OPDG", 29.9611111111, 70.4855555556), - ("OPDI", 31.9091666667, 70.8963888889), - ("OPFA", 31.365, 72.9952777778), - ("OPGD", 25.2330555556, 62.3294444444), - ("OPGT", 35.9186111111, 74.3336111111), - ("OPJA", 28.2841666667, 68.4494444444), - ("OPJI", 25.0677777778, 61.8052777778), - ("OPKC", 24.9063888889, 67.1605555556), - ("OPKD", 25.3180555556, 68.3661111111), - ("OPKH", 27.7925, 66.6427777778), - ("OPKN", 28.5944444444, 65.4247222222), - ("OPLA", 31.5213888889, 74.4033333333), - ("OPLH", 31.4947222222, 74.3461111111), - ("OPMA", 33.05, 73.6383333333), - ("OPMF", 34.3383333333, 73.5083333333), - ("OPMI", 32.5630555556, 71.5705555556), - ("OPMJ", 27.335, 68.1427777778), - ("OPMK", 25.6825, 69.0727777778), - ("OPMN", 33.0125, 70.0641666667), - ("OPMR", 24.8933333333, 66.9386111111), - ("OPMT", 30.2030555556, 71.4188888889), - ("OPNH", 26.2191666667, 68.39), - ("OPNK", 29.5377777778, 66.0222222222), - ("OPOK", 30.7408333333, 73.3575), - ("OPOR", 25.2730555556, 64.5883333333), - ("OPPC", 33.9025, 70.0713888889), - ("OPPG", 26.9544444444, 64.1325), - ("OPPI", 25.2836111111, 63.3327777778), - ("OPPS", 33.9938888889, 71.5144444444), - ("OPQS", 33.5611111111, 73.0319444444), - ("OPQT", 30.2511111111, 66.9375), - ("OPRK", 28.3852777778, 70.2797222222), - ("OPRN", 33.6163888889, 73.0991666667), - ("OPRQ", 30.7580555556, 72.2825), - ("OPRS", 34.0811111111, 71.9725), - ("OPRT", 33.8491666667, 73.7977777778), - ("OPSD", 35.3347222222, 75.5363888889), - ("OPSK", 27.7219444444, 68.7916666667), - ("OPSR", 32.0486111111, 72.665), - ("OPSS", 34.8130555556, 72.3519444444), - ("OPSU", 28.645, 69.1766666667), - ("OPSW", 31.8894444444, 72.3091666667), - ("OPTA", 33.9861111111, 72.6113888889), - ("OPTH", 24.8413888889, 68.8383333333), - ("OPTU", 25.9861111111, 63.03), - ("OPWN", 32.3052777778, 69.5694444444), - ("OPZB", 31.3583333333, 69.4633333333), - ("ORBS", 33.2619444444, 44.2338888889), - ("ORMM", 30.5486111111, 47.6622222222), - ("OSAP", 36.1805555556, 37.2241666667), - ("OSDI", 33.4113888889, 36.5155555556), - ("OSDZ", 35.2852777778, 40.1758333333), - ("OSKL", 37.0236111111, 41.1944444444), - ("OSLK", 35.4008333333, 35.9486111111), - ("OSPR", 34.5572222222, 38.3166666667), - ("OTBD", 25.2611111111, 51.565), - ("PAAQ", 61.5947222222, -149.088611111), - ("PABA", 70.1338888889, -143.576944444), - ("PABE", 60.7797222222, -161.837777778), - ("PABI", 63.9944444444, -145.721388889), - ("PABM", 59.3616666667, -155.257222222), - ("PABR", 71.2852777778, -156.765833333), - ("PABT", 66.9152777778, -151.528055556), - ("PACD", 55.2055555556, -162.724166667), - ("PACL", 64.3011111111, -149.12), - ("PACV", 60.4916666667, -145.4775), - ("PACZ", 61.7802777778, -166.038611111), - ("PADK", 51.8777777778, -176.645833333), - ("PADL", 59.0452777778, -158.503333333), - ("PADQ", 57.75, -152.493611111), - ("PADU", 53.9, -166.543333333), - ("PAED", 61.2511111111, -149.806388889), - ("PAEH", 58.6472222222, -162.060555556), - ("PAEI", 64.6655555556, -147.101388889), - ("PAEN", 60.5730555556, -151.245), - ("PAFA", 64.815, -147.856111111), - ("PAFB", 64.8375, -147.614444444), - ("PAFR", 61.2661111111, -149.653055556), - ("PAGA", 64.7361111111, -156.937222222), - ("PAGK", 62.1547222222, -145.456388889), - ("PAGY", 59.46, -135.315555556), - ("PAHO", 59.6455555556, -151.476388889), - ("PAIL", 59.7536111111, -154.910833333), - ("PAIM", 65.9927777778, -153.704166667), - ("PAJN", 58.3547222222, -134.576111111), - ("PAKN", 58.6766666667, -156.649166667), - ("PAKT", 55.3555555556, -131.713611111), - ("PALU", 68.875, -166.11), - ("PAMC", 62.9527777778, -155.605555556), - ("PAMD", 59.4497222222, -146.308611111), - ("PAMR", 61.2141666667, -149.846111111), - ("PANC", 61.1741666667, -149.996111111), - ("PANT", 55.0422222222, -131.572222222), - ("PAOM", 64.5119444444, -165.445), - ("PAOR", 62.9611111111, -141.928888889), - ("PAOT", 66.8844444444, -162.598333333), - ("PAPB", 56.5783333333, -169.661388889), - ("PAPM", 59.0111111111, -161.819444444), - ("PASC", 70.1947222222, -148.465), - ("PASI", 57.0469444444, -135.361388889), - ("PASN", 57.1672222222, -170.220277778), - ("PASV", 61.0972222222, -155.574166667), - ("PASY", 52.7122222222, 174.113611111), - ("PATA", 65.1741666667, -152.109166667), - ("PATC", 65.5630555556, -167.922222222), - ("PATK", 62.3202777778, -150.093611111), - ("PATL", 62.8941666667, -155.976388889), - ("PAUN", 63.8883333333, -160.798888889), - ("PAVD", 61.1338888889, -146.248333333), - ("PAWT", 70.6133333333, -159.860277778), - ("PAYA", 59.5030555556, -139.66), - ("PCIS", -2.76666666667, -0.0), - ("PFYU", 66.5713888889, -145.250277778), - ("PGRO", 14.1744444444, 145.243333333), - ("PGSN", 15.1194444444, 145.729166667), - ("PGTW", 13.5, 144.833333333), - ("PGUA", 13.5838888889, 144.93), - ("PGUM", 13.4838888889, 144.796944444), - ("PGWT", 14.9977777778, 145.619166667), - ("PHBK", 22.0216666667, -159.786666667), - ("PHDH", 21.5791666667, -158.210277778), - ("PHHI", 21.4833333333, -158.039444444), - ("PHHN", 20.7955555556, -156.014166667), - ("PHJH", 20.9627777778, -156.674166667), - ("PHKO", 19.7386111111, -156.045555556), - ("PHLI", 21.9761111111, -159.338611111), - ("PHMK", 21.1527777778, -157.096111111), - ("PHMU", 20.0011111111, -155.668055556), - ("PHNG", 21.4491666667, -157.767777778), - ("PHNL", 21.3158333333, -157.926666667), - ("PHNY", 20.7855555556, -156.951388889), - ("PHOG", 20.8986111111, -156.430555556), - ("PHSF", 19.76, -155.553611111), - ("PHTO", 19.7202777778, -155.048611111), - ("PHUP", 20.265, -155.859722222), - ("PJON", 16.7286111111, -169.534166667), - ("PKMA", 11.3408333333, 162.327777778), - ("PKMJ", 7.06472222222, 171.271944444), - ("PKRO", 9.39666666667, 167.470833333), - ("PKWA", 8.72, 167.731388889), - ("PLCH", 1.98611111111, -157.349722222), - ("PMDY", 28.2013888889, -177.381388889), - ("POLI", 70.4994444444, -149.879444444), - ("PPIZ", 69.7327777778, -163.005277778), - ("PTKK", 7.46166666667, 151.842777778), - ("PTPN", 6.985, 158.208888889), - ("PTRO", 7.3675, 134.543888889), - ("PTSA", 5.35666666667, 162.958333333), - ("PTYA", 9.49861111111, 138.082222222), - ("RCBS", 24.4319444444, 118.359444444), - ("RCDC", 22.6722222222, 120.461666667), - ("RCDI", 24.855, 121.2375), - ("RCFN", 22.7566666667, 121.093333333), - ("RCGI", 22.6744444444, 121.458333333), - ("RCGM", 25.0555555556, 121.2425), - ("RCKH", 22.5752777778, 120.350833333), - ("RCKU", 23.4616666667, 120.392777778), - ("RCLG", 24.1861111111, 120.653611111), - ("RCLY", 22.0294444444, 121.527222222), - ("RCMQ", 24.2644444444, 120.620555556), - ("RCMT", 26.2238888889, 120.0025), - ("RCNN", 22.9502777778, 120.205555556), - ("RCPO", 24.8177777778, 120.939166667), - ("RCQC", 23.5686111111, 119.628055556), - ("RCQS", 22.7930555556, 121.181944444), - ("RCRA", 22.7047222222, 120.280555556), - ("RCSQ", 22.7, 120.482222222), - ("RCSS", 25.0694444444, 121.551666667), - ("RCTP", 25.08, 121.232222222), - ("RCWA", 23.3708333333, 119.494444444), - ("RCYU", 24.0230555556, 121.617777778), - ("RJAA", 35.7647222222, 140.386388889), - ("RJAF", 36.1666666667, 137.922777778), - ("RJAH", 36.1808333333, 140.415277778), - ("RJAM", 24.2894444444, 153.978888889), - ("RJAW", 24.7838888889, 141.3225), - ("RJBD", 33.6622222222, 135.364444444), - ("RJBK", 34.5908333333, 133.933055556), - ("RJCB", 42.7333333333, 143.217222222), - ("RJCC", 42.775, 141.692222222), - ("RJCH", 41.77, 140.821944444), - ("RJCJ", 42.7944444444, 141.666388889), - ("RJCM", 43.8805555556, 144.163888889), - ("RJCN", 43.5772222222, 144.959722222), - ("RJCO", 43.1161111111, 141.38), - ("RJCT", 42.8902777778, 143.158333333), - ("RJCW", 45.4038888889, 141.800833333), - ("RJDB", 33.7488888889, 129.785277778), - ("RJDC", 33.93, 131.278888889), - ("RJDT", 34.2847222222, 129.330277778), - ("RJEB", 44.3038888889, 143.403888889), - ("RJEC", 43.6708333333, 142.4475), - ("RJER", 45.2419444444, 141.186388889), - ("RJFA", 33.8830555556, 130.652777778), - ("RJFC", 30.3855555556, 130.658888889), - ("RJFE", 32.6661111111, 128.832777778), - ("RJFF", 33.5863888889, 130.45), - ("RJFG", 30.5466666667, 130.95), - ("RJFK", 31.8033333333, 130.719166667), - ("RJFM", 31.8769444444, 131.448333333), - ("RJFN", 32.0836111111, 131.451666667), - ("RJFO", 33.4794444444, 131.737222222), - ("RJFR", 33.8361111111, 130.946944444), - ("RJFT", 32.8372222222, 130.855), - ("RJFU", 32.9225, 129.923333333), - ("RJFY", 31.3675, 130.845277778), - ("RJFZ", 33.6852777778, 131.040555556), - ("RJKA", 28.4305555556, 129.7125), - ("RJKB", 27.4252777778, 128.700833333), - ("RJKN", 27.8361111111, 128.881111111), - ("RJNF", 36.1427777778, 136.223888889), - ("RJNG", 35.3941666667, 136.869444444), - ("RJNH", 34.75, 137.703055556), - ("RJNK", 36.3936111111, 136.407777778), - ("RJNN", 35.255, 136.924444444), - ("RJNO", 36.1811111111, 133.324722222), - ("RJNT", 36.6483333333, 137.187222222), - ("RJNY", 34.8125, 138.297777778), - ("RJOA", 34.4352777778, 132.921944444), - ("RJOB", 34.7569444444, 133.855555556), - ("RJOC", 35.4136111111, 132.89), - ("RJOF", 34.0344444444, 131.549166667), - ("RJOH", 35.4922222222, 133.236388889), - ("RJOI", 34.1436111111, 132.235555556), - ("RJOK", 33.5444444444, 133.671388889), - ("RJOM", 33.8272222222, 132.699722222), - ("RJOO", 34.7852777778, 135.438055556), - ("RJOR", 35.53, 134.166388889), - ("RJOS", 34.1327777778, 134.606388889), - ("RJOT", 34.2138888889, 134.015555556), - ("RJOY", 34.5961111111, 135.602777778), - ("RJOZ", 34.0452777778, 131.051944444), - ("RJSA", 40.7344444444, 140.690833333), - ("RJSC", 38.4116666667, 140.371111111), - ("RJSH", 40.5563888889, 141.466111111), - ("RJSI", 39.4308333333, 141.135833333), - ("RJSK", 39.6155555556, 140.218611111), - ("RJSM", 40.7030555556, 141.368333333), - ("RJSS", 38.1394444444, 140.916666667), - ("RJST", 38.4047222222, 141.219444444), - ("RJSY", 38.8116666667, 139.786944444), - ("RJTA", 35.4544444444, 139.45), - ("RJTE", 34.9869444444, 139.829166667), - ("RJTF", 35.6716666667, 139.528055556), - ("RJTH", 33.115, 139.785555556), - ("RJTJ", 35.8413888889, 139.409722222), - ("RJTK", 35.3980555556, 139.909722222), - ("RJTL", 35.7988888889, 140.011111111), - ("RJTO", 34.7844444444, 139.361388889), - ("RJTQ", 34.0719444444, 139.559722222), - ("RJTR", 35.5136111111, 139.393611111), - ("RJTT", 35.5522222222, 139.779444444), - ("RJTY", 35.7483333333, 139.348333333), - ("RKJJ", 35.1255555556, 126.809722222), - ("RKJK", 35.9036111111, 126.615833333), - ("RKJM", 34.7588888889, 126.379722222), - ("RKJU", 35.8783333333, 127.119444444), - ("RKJY", 34.8397222222, 127.615277778), - ("RKNC", 37.8836111111, 127.717777778), - ("RKND", 38.1475, 128.600555556), - ("RKNN", 37.7533333333, 128.943888889), - ("RKNW", 37.4380555556, 127.960277778), - ("RKNY", 38.0611111111, 128.668888889), - ("RKPC", 33.5111111111, 126.492777778), - ("RKPE", 35.1411111111, 128.695555556), - ("RKPK", 35.1794444444, 128.938055556), - ("RKPP", 35.1708333333, 129.128611111), - ("RKPS", 35.0883333333, 128.070277778), - ("RKPU", 35.5933333333, 129.351666667), - ("RKSG", 36.9605555556, 127.033333333), - ("RKSM", 37.4458333333, 127.113888889), - ("RKSO", 37.0905555556, 127.029444444), - ("RKSS", 37.5580555556, 126.790555556), - ("RKSW", 37.2391666667, 127.006944444), - ("RKTH", 35.9877777778, 129.420277778), - ("RKTJ", 35.8563888889, 129.211388889), - ("RKTN", 35.8938888889, 128.658611111), - ("RKTU", 36.7163888889, 127.498888889), - ("RKTY", 36.6316666667, 128.354722222), - ("ROAH", 26.1955555556, 127.645833333), - ("RODE", 26.7286111111, 127.761666667), - ("RODN", 26.3555555556, 127.7675), - ("ROIG", 24.3444444444, 124.186944444), - ("ROKJ", 26.3633333333, 126.713611111), - ("ROMD", 25.8463888889, 131.263333333), - ("ROMY", 24.7827777778, 125.295), - ("RORK", 25.9477777778, 131.321388889), - ("RORS", 24.8266666667, 125.144722222), - ("RORY", 27.0438888889, 128.401388889), - ("ROTM", 26.2741666667, 127.756388889), - ("ROYN", 24.4669444444, 122.977777778), - ("RPLL", 14.5086111111, 121.019444444), - ("RPMB", 6.10555555556, 125.236111111), - ("RPMC", 7.16472222222, 124.210277778), - ("RPML", 8.41444444444, 124.611388889), - ("RPMM", 7.61722222222, 124.058611111), - ("RPMP", 7.82777777778, 123.460277778), - ("RPMR", 6.05805555556, 125.096111111), - ("RPMS", 9.75777777778, 125.480833333), - ("RPMZ", 6.92222222222, 122.059444444), - ("RPUB", 16.375, 120.618888889), - ("RPUD", 14.1291666667, 122.980277778), - ("RPUF", 14.9863888889, 120.4925), - ("RPUG", 16.0347222222, 120.240833333), - ("RPUH", 12.3613888889, 121.046388889), - ("RPUI", 15.3255555556, 119.968888889), - ("RPUL", 13.955, 121.124722222), - ("RPUM", 13.2080555556, 120.605277778), - ("RPUN", 13.5852777778, 123.270833333), - ("RPUO", 20.4516666667, 121.98), - ("RPUP", 14.2927777778, 122.645555556), - ("RPUQ", 17.5536111111, 120.3575), - ("RPUS", 16.5955555556, 120.303055556), - ("RPUT", 17.6380555556, 121.730555556), - ("RPUV", 13.5775, 124.206111111), - ("RPUW", 13.3611111111, 121.825277778), - ("RPUY", 16.9297222222, 121.753333333), - ("RPUZ", 16.6188888889, 121.252222222), - ("RPVA", 11.2272222222, 125.027777778), - ("RPVB", 10.6425, 122.929444444), - ("RPVC", 12.0725, 124.545), - ("RPVD", 9.33416666667, 123.301944444), - ("RPVF", 12.5022222222, 124.635555556), - ("RPVG", 11.0355555556, 125.742777778), - ("RPVI", 10.7130555556, 122.545), - ("RPVK", 11.6811111111, 122.377777778), - ("RPVM", 10.3075, 123.979166667), - ("RPVO", 11.0558333333, 124.565555556), - ("RPVP", 9.74194444444, 118.758611111), - ("RPVR", 11.5975, 122.752777778), - ("RPVS", 10.7661111111, 121.932222222), - ("SAAC", -31.2969444444, -57.9963888889), - ("SAAG", -33.0058333333, -58.6130555556), - ("SAAI", -35.3477777778, -57.2938888889), - ("SAAJ", -34.5458333333, -60.9305555556), - ("SAAP", -31.7947222222, -60.4802777778), - ("SAAR", -32.9033333333, -60.7844444444), - ("SAAV", -31.7116666667, -60.8116666667), - ("SABE", -34.5591666667, -58.4155555556), - ("SACC", -31.0066666667, -64.5325), - ("SACO", -31.3236111111, -64.2077777778), - ("SACT", -30.3452777778, -66.2936111111), - ("SADD", -34.5005555556, -58.6041666667), - ("SADF", -34.4530555556, -58.5894444444), - ("SADJ", -34.5605555556, -58.7894444444), - ("SADL", -34.9722222222, -57.8944444444), - ("SADM", -34.6761111111, -58.6425), - ("SADP", -34.6097222222, -58.6125), - ("SADS", -34.7313888889, -58.5994444444), - ("SAHC", -37.4444444444, -70.2222222222), - ("SAHR", -39.0005555556, -67.6202777778), - ("SAME", -32.8316666667, -68.7927777778), - ("SAMM", -35.4838888889, -69.5825), - ("SAMQ", -32.8658333333, -68.8722222222), - ("SAMR", -34.5880555556, -68.4025), - ("SANC", -28.5955555556, -65.7516666667), - ("SANE", -27.7655555556, -64.31), - ("SANI", -28.0375, -67.5802777778), - ("SANL", -29.3813888889, -66.7958333333), - ("SANO", -29.2238888889, -67.4388888889), - ("SANT", -26.8408333333, -65.1047222222), - ("SANU", -31.5713888889, -68.4180555556), - ("SAOC", -33.0855555556, -64.2613888889), - ("SAOD", -31.9411111111, -65.1422222222), - ("SAOL", -34.1352777778, -63.3622222222), - ("SAOM", -32.6836111111, -62.1577777778), - ("SAOR", -33.7297222222, -65.3872222222), - ("SAOU", -33.2730555556, -66.3563888889), - ("SARC", -27.4452777778, -58.7616666667), - ("SARE", -27.4497222222, -59.0561111111), - ("SARF", -26.2125, -58.2280555556), - ("SARI", -25.7375, -54.4730555556), - ("SARL", -29.6891666667, -57.1519444444), - ("SARM", -30.2716666667, -57.64), - ("SARP", -27.3858333333, -55.9705555556), - ("SARS", -26.7563888889, -60.4930555556), - ("SASA", -24.8558333333, -65.4861111111), - ("SASJ", -24.3927777778, -65.0977777778), - ("SASO", -23.1527777778, -64.3291666667), - ("SASQ", -22.1622222222, -65.5697222222), - ("SAST", -22.6197222222, -63.7936111111), - ("SATG", -29.1058333333, -59.2186111111), - ("SATK", -24.7211111111, -60.5486111111), - ("SATM", -29.2230555556, -58.0880555556), - ("SATO", -27.5180555556, -55.1238888889), - ("SATR", -29.21, -59.6908333333), - ("SATU", -29.7705555556, -57.9788888889), - ("SAVB", -41.9430555556, -71.5322222222), - ("SAVC", -45.785, -67.4655555556), - ("SAVD", -42.0305555556, -71.1697222222), - ("SAVE", -42.9077777778, -71.1394444444), - ("SAVH", -46.5383333333, -68.9658333333), - ("SAVT", -43.2102777778, -65.2702777778), - ("SAVV", -40.8691666667, -63.0002777778), - ("SAVY", -42.7588888889, -65.1025), - ("SAWA", -50.3352777778, -72.2483333333), - ("SAWB", -64.2383333333, -56.6308333333), - ("SAWD", -47.7352777778, -65.9038888889), - ("SAWE", -53.7775, -67.7491666667), - ("SAWG", -51.6086111111, -69.3125), - ("SAWH", -54.8430555556, -68.2955555556), - ("SAWJ", -49.3066666667, -67.8025), - ("SAWS", -44.0480555556, -70.4591666667), - ("SAWT", -51.6063888889, -72.2166666667), - ("SAWU", -50.0163888889, -68.5791666667), - ("SAZB", -38.7247222222, -62.1691666667), - ("SAZC", -37.4461111111, -61.8891666667), - ("SAZD", -36.3202777778, -57.7216666667), - ("SAZF", -36.8908333333, -60.2161111111), - ("SAZG", -35.6961111111, -63.7580555556), - ("SAZH", -38.3866666667, -60.3294444444), - ("SAZI", -36.1869444444, -61.0761111111), - ("SAZL", -36.5422222222, -56.7216666667), - ("SAZM", -37.9341666667, -57.5733333333), - ("SAZN", -38.9488888889, -68.1555555556), - ("SAZO", -38.4894444444, -58.8158333333), - ("SAZP", -35.8455555556, -61.8577777778), - ("SAZR", -36.5880555556, -64.2752777778), - ("SAZS", -41.1511111111, -71.1575), - ("SAZT", -37.2372222222, -59.2277777778), - ("SAZV", -37.2352777778, -57.0291666667), - ("SAZW", -38.9394444444, -69.2644444444), - ("SAZY", -40.0752777778, -71.1372222222), - ("SBAA", -8.34833333333, -49.3013888889), - ("SBAF", -22.875, -43.3844444444), - ("SBAM", 2.07666666667, -50.8622222222), - ("SBAQ", -21.8119444444, -48.1327777778), - ("SBAR", -10.9838888889, -37.0702777778), - ("SBAS", -22.6383333333, -50.4558333333), - ("SBAT", -9.86583333333, -56.1061111111), - ("SBAU", -21.1411111111, -50.4247222222), - ("SBAV", -22.5255555556, -52.9719444444), - ("SBBE", -1.37916666667, -48.4761111111), - ("SBBG", -31.3902777778, -54.1122222222), - ("SBBH", -19.8516666667, -43.9502777778), - ("SBBI", -25.405, -49.2319444444), - ("SBBQ", -21.2669444444, -43.7608333333), - ("SBBR", -15.8625, -47.9125), - ("SBBU", -22.345, -49.0536111111), - ("SBBV", 2.84611111111, -60.69), - ("SBBW", -15.8611111111, -52.3888888889), - ("SBCA", -25.0002777778, -53.5005555556), - ("SBCC", -9.33388888889, -54.9652777778), - ("SBCF", -19.6336111111, -43.9686111111), - ("SBCG", -20.4686111111, -54.6725), - ("SBCH", -27.1341666667, -52.6563888889), - ("SBCI", -7.32027777778, -47.4586111111), - ("SBCM", -28.7255555556, -49.4247222222), - ("SBCO", -29.9458333333, -51.1444444444), - ("SBCP", -21.6983333333, -41.3016666667), - ("SBCR", -19.0116666667, -57.6727777778), - ("SBCT", -25.5283333333, -49.1755555556), - ("SBCV", -17.6522222222, -39.2530555556), - ("SBCX", -29.1969444444, -51.1875), - ("SBCY", -15.6527777778, -56.1166666667), - ("SBCZ", -7.6, -72.7694444444), - ("SBDN", -22.175, -51.4244444444), - ("SBEG", -3.03861111111, -60.0497222222), - ("SBEK", -6.23305555556, -57.7766666667), - ("SBES", -22.8127777778, -42.0925), - ("SBFC", -20.5919444444, -47.3827777778), - ("SBFI", -25.5961111111, -54.4869444444), - ("SBFL", -27.6725, -48.5477777778), - ("SBFN", -3.85472222222, -32.4233333333), - ("SBFT", -20.2783333333, -49.1872222222), - ("SBFU", -20.7027777778, -46.335), - ("SBFZ", -3.77611111111, -38.5325), - ("SBGL", -22.8088888889, -43.2436111111), - ("SBGM", -10.7861111111, -65.2847222222), - ("SBGO", -16.6311111111, -49.2222222222), - ("SBGR", -23.4322222222, -46.4691666667), - ("SBGS", -25.1844444444, -50.1438888889), - ("SBGW", -22.7913888889, -45.2047222222), - ("SBHT", -3.25388888889, -52.2538888889), - ("SBIC", -3.12722222222, -58.4811111111), - ("SBIH", -4.24222222222, -56.0005555556), - ("SBIL", -14.8158333333, -39.0330555556), - ("SBIP", -19.4705555556, -42.4875), - ("SBIT", -18.4444444444, -49.2133333333), - ("SBIZ", -5.53111111111, -47.46), - ("SBJC", -1.41388888889, -48.4605555556), - ("SBJF", -21.7913888889, -43.3866666667), - ("SBJP", -7.26972222222, -35.8961111111), - ("SBJV", -26.2247222222, -48.7972222222), - ("SBKP", -23.0080555556, -47.1344444444), - ("SBLJ", -27.7819444444, -50.2813888889), - ("SBLN", -21.6638888889, -49.7302777778), - ("SBLO", -23.3336111111, -51.13), - ("SBLP", -13.2619444444, -43.4080555556), - ("SBLS", -19.6613888889, -43.8963888889), - ("SBMA", -5.36833333333, -49.1377777778), - ("SBMD", -0.889722222222, -52.6022222222), - ("SBMG", -23.4397222222, -51.9069444444), - ("SBMK", -16.7066666667, -43.8188888889), - ("SBML", -22.1966666667, -49.9263888889), - ("SBMN", -3.14555555556, -59.9861111111), - ("SBMO", -9.51027777778, -35.7933333333), - ("SBMQ", 0.0505555555556, -51.0719444444), - ("SBMS", -5.20166666667, -37.3641666667), - ("SBMT", -23.5088888889, -46.6375), - ("SBMY", -5.81138888889, -61.2786111111), - ("SBNF", -26.88, -48.6513888889), - ("SBNM", -28.2816666667, -54.1688888889), - ("SBNT", -5.91111111111, -35.2477777778), - ("SBOI", 3.85527777778, -51.7966666667), - ("SBPA", -29.9941666667, -51.1713888889), - ("SBPB", -2.89361111111, -41.7319444444), - ("SBPC", -21.8427777778, -46.5677777778), - ("SBPF", -28.2438888889, -52.3263888889), - ("SBPK", -31.7183333333, -52.3275), - ("SBPL", -9.36388888889, -40.5638888889), - ("SBPN", -10.7191666667, -48.3997222222), - ("SBPP", -22.5494444444, -55.7025), - ("SBPV", -8.70916666667, -63.9022222222), - ("SBQV", -14.8625, -40.8630555556), - ("SBRB", -9.86888888889, -67.8936111111), - ("SBRF", -8.12638888889, -34.9233333333), - ("SBRG", -32.0825, -52.1663888889), - ("SBRJ", -22.9102777778, -43.1630555556), - ("SBRP", -21.1341666667, -47.7741666667), - ("SBSC", -22.9322222222, -43.7188888889), - ("SBSJ", -23.2291666667, -45.8613888889), - ("SBSL", -2.58861111111, -44.2363888889), - ("SBSM", -29.7111111111, -53.6880555556), - ("SBSP", -23.6266666667, -46.6552777778), - ("SBSR", -20.8163888889, -49.4063888889), - ("SBST", -23.925, -46.2875), - ("SBSV", -12.9108333333, -38.3308333333), - ("SBTB", -1.48944444444, -56.3966666667), - ("SBTE", -5.05972222222, -42.8233333333), - ("SBTF", -3.38277777778, -64.7238888889), - ("SBTK", -8.155, -70.7830555556), - ("SBTL", -24.3175, -50.6513888889), - ("SBTS", 2.22333333333, -55.9458333333), - ("SBTT", -4.25555555556, -69.9355555556), - ("SBTU", -3.785, -49.7194444444), - ("SBUA", -0.148333333333, -66.9855555556), - ("SBUF", -9.40083333333, -38.2505555556), - ("SBUG", -29.7819444444, -57.0380555556), - ("SBUL", -18.8827777778, -48.2255555556), - ("SBUP", -20.7769444444, -51.5647222222), - ("SBUR", -19.765, -47.9647222222), - ("SBVG", -21.59, -45.4733333333), - ("SBVH", -12.6941666667, -60.0980555556), - ("SBVT", -20.2555555556, -40.2888888889), - ("SBYA", 0.6075, -69.1858333333), - ("SBYS", -21.9852777778, -47.3380555556), - ("SCAC", -41.9061111111, -73.7966666667), - ("SCAP", -43.6152777778, -71.8069444444), - ("SCAR", -18.3483333333, -70.3386111111), - ("SCBA", -45.9158333333, -71.6891666667), - ("SCBQ", -33.5616666667, -70.6883333333), - ("SCCC", -46.5816666667, -71.6975), - ("SCCF", -22.4986111111, -68.9041666667), - ("SCCH", -36.5827777778, -72.0316666667), - ("SCCI", -53.0027777778, -70.8547222222), - ("SCCY", -45.5941666667, -72.1061111111), - ("SCDA", -20.535, -70.1811111111), - ("SCEL", -33.3927777778, -70.7855555556), - ("SCFA", -23.4444444444, -70.445), - ("SCFM", -53.2536111111, -70.3191666667), - ("SCGE", -37.4016666667, -72.4255555556), - ("SCGZ", -54.9308333333, -67.6261111111), - ("SCHA", -27.2961111111, -70.4136111111), - ("SCIC", -34.9669444444, -71.2169444444), - ("SCIE", -36.7725, -73.0630555556), - ("SCIP", -27.1647222222, -109.421666667), - ("SCJO", -40.6113888889, -73.0602777778), - ("SCLL", -28.5975, -70.7591666667), - ("SCRG", -34.1736111111, -70.7755555556), - ("SCRM", -62.1908333333, -58.9866666667), - ("SCSE", -29.9163888889, -71.1911111111), - ("SCSN", -33.6566666667, -71.6155555556), - ("SCST", -42.4908333333, -73.7744444444), - ("SCTB", -33.4563888889, -70.5466666667), - ("SCTC", -38.7686111111, -72.6358333333), - ("SCTE", -41.4386111111, -73.0938888889), - ("SCTI", -33.4933333333, -70.6975), - ("SCTN", -42.9330555556, -72.6991666667), - ("SCVD", -39.6497222222, -73.0861111111), - ("SEAM", -1.2125, -78.5741666667), - ("SECM", -1.70611111111, -79.3788888889), - ("SECO", -0.462777777778, -76.9863888889), - ("SECU", -2.88944444444, -78.9841666667), - ("SEGS", -0.453611111111, -90.2658333333), - ("SEGU", -2.15777777778, -79.8838888889), - ("SEGZ", -3.42333333333, -78.5730555556), - ("SEIB", 0.338333333333, -78.1363888889), - ("SELA", 0.0922222222222, -76.8691666667), - ("SELJ", -1.70416666667, -79.5522222222), - ("SELM", -1.50138888889, -79.4808333333), - ("SELT", -0.906666666667, -78.6155555556), - ("SEMA", -4.38027777778, -79.9405555556), - ("SEMC", -2.29916666667, -78.1205555556), - ("SEMH", -3.26888888889, -79.9616666667), - ("SEMO", -2.06694444444, -76.9752777778), - ("SEMT", -0.945555555556, -80.6780555556), - ("SEMX", -2.85083333333, -79.8036111111), - ("SEMY", -1.73972222222, -79.6216666667), - ("SEPD", 0.0730555555556, -80.0522222222), - ("SEPV", -1.04138888889, -80.4719444444), - ("SEQU", -0.141111111111, -78.4880555556), - ("SERB", -1.65361111111, -78.6561111111), - ("SERO", -3.43527777778, -79.9777777778), - ("SESA", -2.20472222222, -80.9886111111), - ("SESD", -0.248055555556, -79.2144444444), - ("SEST", -0.909722222222, -89.6158333333), - ("SETA", -2.26083333333, -79.6891666667), - ("SETE", -0.986666666667, -77.8194444444), - ("SETR", -0.122777777778, -76.3375), - ("SETU", 0.809444444444, -77.7080555556), - ("SFAL", -51.6855555556, -57.7775), - ("SGAS", -25.2397222222, -57.5188888889), - ("SGAY", -27.3705555556, -56.8538888889), - ("SGCO", -23.4416666667, -57.4269444444), - ("SGFI", -22.3597222222, -60.0536111111), - ("SGIB", -25.4075, -54.6194444444), - ("SGME", -22.0447222222, -60.6216666667), - ("SGPI", -26.8813888889, -58.3177777778), - ("SKAR", 4.45361111111, -75.7652777778), - ("SKAS", 0.505, -76.5008333333), - ("SKBC", 9.04527777778, -73.9747222222), - ("SKBG", 7.12638888889, -73.1847222222), - ("SKBO", 4.70138888889, -74.1469444444), - ("SKBQ", 10.8894444444, -74.7805555556), - ("SKBS", 6.20277777778, -77.3944444444), - ("SKBU", 3.81944444444, -76.9897222222), - ("SKCC", 7.9275, -72.5113888889), - ("SKCD", 5.07166666667, -76.6763888889), - ("SKCG", 10.4422222222, -75.5127777778), - ("SKCL", 3.54305555556, -76.3813888889), - ("SKCO", 1.81416666667, -78.7491666667), - ("SKCZ", 9.3325, -75.2855555556), - ("SKEJ", 7.02416666667, -73.8066666667), - ("SKFL", 1.59027777778, -75.5638888889), - ("SKGI", 4.27611111111, -74.7966666667), - ("SKGO", 4.75805555556, -75.9555555556), - ("SKGP", 2.57, -77.8983333333), - ("SKGY", 4.81222222222, -74.0647222222), - ("SKIB", 4.42138888889, -75.1330555556), - ("SKIP", 0.861666666667, -77.6716666667), - ("SKLC", 7.81194444444, -76.7163888889), - ("SKLM", 11.2325, -72.49), - ("SKLT", -4.19305555556, -69.9425), - ("SKMD", 6.22, -75.5905555556), - ("SKMG", 9.28333333333, -74.8394444444), - ("SKMR", 8.82361111111, -75.8258333333), - ("SKMU", 1.25361111111, -70.2336111111), - ("SKMZ", 5.02972222222, -75.465), - ("SKNV", 2.95, -75.2938888889), - ("SKOC", 8.31472222222, -73.3583333333), - ("SKOT", 7.01027777778, -74.7152777778), - ("SKPB", 12.2213888889, -71.9847222222), - ("SKPC", 6.18444444444, -67.4930555556), - ("SKPE", 4.8125, -75.7394444444), - ("SKPI", 1.85833333333, -76.0858333333), - ("SKPP", 2.45416666667, -76.61), - ("SKPS", 1.39638888889, -77.2908333333), - ("SKPV", 13.3569444444, -81.3583333333), - ("SKQU", 5.2125, -74.8836111111), - ("SKRG", 6.16444444444, -75.4230555556), - ("SKRH", 11.5261111111, -72.9258333333), - ("SKSA", 6.95805555556, -71.855), - ("SKSJ", 2.57944444444, -72.6391666667), - ("SKSM", 11.1194444444, -74.2305555556), - ("SKSP", 12.5833333333, -81.7111111111), - ("SKSV", 2.15194444444, -74.7661111111), - ("SKTD", 5.43027777778, -71.6580555556), - ("SKTM", 6.45083333333, -71.76), - ("SKTU", 8.07444444444, -76.7411111111), - ("SKUC", 7.06861111111, -70.7366666667), - ("SKUI", 5.69055555556, -76.6411111111), - ("SKUL", 4.08833333333, -76.235), - ("SKVP", 10.435, -73.2494444444), - ("SKVV", 4.16777777778, -73.6136111111), - ("SKYP", 5.31888888889, -72.3838888889), - ("SLAP", -14.7394444444, -68.4108333333), - ("SLAS", -15.7191666667, -63.0922222222), - ("SLBJ", -22.7694444444, -64.315), - ("SLCA", -20.0069444444, -63.5275), - ("SLCB", -17.4208333333, -66.1769444444), - ("SLCH", -16.99, -65.1413888889), - ("SLCN", -17.5938888889, -69.4341666667), - ("SLCO", -11.0402777778, -68.7827777778), - ("SLCP", -16.1433333333, -62.0258333333), - ("SLGY", -10.8216666667, -65.3458333333), - ("SLJO", -13.0527777778, -64.6616666667), - ("SLLP", -16.5130555556, -68.1922222222), - ("SLMG", -13.2536111111, -64.0627777778), - ("SLOR", -17.9633333333, -67.0761111111), - ("SLPO", -19.5433333333, -65.7238888889), - ("SLPS", -18.9752777778, -57.8205555556), - ("SLRA", -13.2636111111, -64.6052777778), - ("SLRB", -18.3280555556, -59.7661111111), - ("SLRI", -11.0102777778, -66.0733333333), - ("SLRQ", -14.4283333333, -67.5013888889), - ("SLRY", -14.3061111111, -67.3536111111), - ("SLSA", -13.7619444444, -65.435), - ("SLSB", -14.8575, -66.7375), - ("SLSI", -16.3844444444, -60.9627777778), - ("SLSM", -14.9655555556, -65.6336111111), - ("SLSU", -19.0069444444, -65.2888888889), - ("SLTI", -16.3386111111, -58.4016666667), - ("SLTJ", -21.5555555556, -64.7008333333), - ("SLTR", -14.8194444444, -64.9183333333), - ("SLVR", -17.6447222222, -63.1352777778), - ("SMJP", 5.45277777778, -55.1877777778), - ("SMZO", 5.81083333333, -55.1905555556), - ("SOCA", 4.81972222222, -52.3602777778), - ("SOOG", 3.8975, -51.8038888889), - ("SPAC", -4.6075, -77.9408333333), - ("SPAS", -2.795, -76.4661111111), - ("SPAY", -10.7288888889, -73.7663888889), - ("SPBB", -6.01888888889, -76.9883333333), - ("SPBC", -3.91666666667, -70.5080555556), - ("SPBR", -11.4113888889, -69.4886111111), - ("SPCL", -8.37777777778, -74.5741666667), - ("SPEO", -9.15083333333, -78.5236111111), - ("SPEP", -9.76805555556, -70.7063888889), - ("SPEQ", -17.1788888889, -70.9305555556), - ("SPGM", -9.29, -76.0058333333), - ("SPHI", -6.78722222222, -79.8280555556), - ("SPHO", -13.1547222222, -74.2041666667), - ("SPHY", -13.7063888889, -73.3502777778), - ("SPHZ", -9.34722222222, -77.5983333333), - ("SPIM", -12.0216666667, -77.1141666667), - ("SPJI", -7.16944444444, -76.7277777778), - ("SPJJ", -11.7830555556, -75.4733333333), - ("SPJL", -15.4669444444, -70.1580555556), - ("SPJN", -15.3575, -75.1355555556), - ("SPJR", -7.13638888889, -78.49), - ("SPLO", -17.695, -71.3438888889), - ("SPLP", -12.1605555556, -76.9988888889), - ("SPME", -3.5525, -80.3808333333), - ("SPMS", -5.89388888889, -76.1183333333), - ("SPNC", -9.87805555556, -76.2041666667), - ("SPOL", -11.9286111111, -77.0611111111), - ("SPPY", -6.20166666667, -77.8558333333), - ("SPQT", -3.78472222222, -73.3086111111), - ("SPQU", -16.3408333333, -71.5830555556), - ("SPRM", -11.1286111111, -75.3502777778), - ("SPRU", -8.08472222222, -79.1094444444), - ("SPSO", -13.7447222222, -76.2202777778), - ("SPST", -6.50861111111, -76.3730555556), - ("SPTN", -18.0533333333, -70.2758333333), - ("SPTP", -4.54972222222, -81.2238888889), - ("SPTU", -12.6136111111, -69.2288888889), - ("SPUR", -5.20555555556, -80.6163888889), - ("SPYL", -4.57638888889, -81.2538888889), - ("SPZA", -14.8538888889, -74.9613888889), - ("SPZO", -13.5355555556, -71.9386111111), - ("SUAA", -34.7891666667, -56.2644444444), - ("SUAG", -30.4005555556, -56.5077777778), - ("SUCA", -34.4563888889, -57.7705555556), - ("SUDU", -33.3586111111, -56.4991666667), - ("SULS", -34.855, -55.0941666667), - ("SUMO", -32.3377777778, -54.2166666667), - ("SUMU", -34.8377777778, -56.0302777778), - ("SUPE", -34.9136111111, -54.9205555556), - ("SUPU", -32.365, -58.0611111111), - ("SURV", -30.9744444444, -55.4761111111), - ("SUSO", -31.4397222222, -57.9905555556), - ("SUTB", -31.7488888889, -55.9255555556), - ("SVAC", 9.55333333333, -69.2377777778), - ("SVAN", 9.42916666667, -64.4708333333), - ("SVAT", 4.05166666667, -67.7008333333), - ("SVBC", 10.1069444444, -64.6888888889), - ("SVBI", 8.61944444444, -70.2205555556), - ("SVBL", 10.1833333333, -67.5572222222), - ("SVBM", 10.0425, -69.3583333333), - ("SVBS", 10.2497222222, -67.6491666667), - ("SVCB", 8.12194444444, -63.5369444444), - ("SVCD", 7.62583333333, -66.1647222222), - ("SVCJ", 9.64888888889, -68.5752777778), - ("SVCL", 8.92444444444, -67.4169444444), - ("SVCN", 6.23194444444, -62.8541666667), - ("SVCO", 10.1755555556, -70.065), - ("SVCP", 10.66, -63.2616666667), - ("SVCR", 11.4147222222, -69.6808333333), - ("SVCS", 10.2861111111, -66.8158333333), - ("SVCU", 10.4502777778, -64.1302777778), - ("SVCZ", 9.37194444444, -66.9227777778), - ("SVED", 6.715, -61.6388888889), - ("SVEZ", 7.05972222222, -69.4966666667), - ("SVGD", 7.21083333333, -70.7563888889), - ("SVGI", 10.5738888889, -62.3125), - ("SVGU", 9.02694444444, -69.755), - ("SVHG", 10.4622222222, -66.0925), - ("SVIE", 10.7941666667, -63.9813888889), - ("SVJC", 11.7808333333, -70.1516666667), - ("SVJM", 9.90694444444, -67.3794444444), - ("SVLF", 8.23916666667, -72.2708333333), - ("SVLO", 11.8086111111, -66.1791666667), - ("SVMC", 10.5580555556, -71.7277777778), - ("SVMD", 8.58194444444, -71.1608333333), - ("SVMG", 10.9125, -63.9663888889), - ("SVMI", 10.6030555556, -66.9905555556), - ("SVMT", 9.74916666667, -63.1522222222), - ("SVPA", 5.61972222222, -67.6058333333), - ("SVPC", 10.4802777778, -68.0727777778), - ("SVPM", 7.80111111111, -72.2027777778), - ("SVPR", 8.28833333333, -62.7602777778), - ("SVPT", 7.57555555556, -70.1741666667), - ("SVSA", 7.85222222222, -72.4347222222), - ("SVSB", 7.80333333333, -71.1655555556), - ("SVSO", 7.565, -72.035), - ("SVSP", 10.2786111111, -68.755), - ("SVSR", 7.8825, -67.4436111111), - ("SVST", 8.945, -64.1508333333), - ("SVSZ", 8.97444444444, -71.9430555556), - ("SVTC", 9.08888888889, -62.0941666667), - ("SVTM", 7.24916666667, -61.5288888889), - ("SVVA", 10.1580555556, -67.9266666667), - ("SVVG", 8.62416666667, -71.6727777778), - ("SVVL", 9.34055555556, -70.5838888889), - ("SVVP", 9.22194444444, -65.9933333333), - ("SYKM", 5.86527777778, -60.6141666667), - ("SYLD", 5.96583333333, -58.2702777778), - ("SYLT", 3.3725, -59.7891666667), - ("TAPA", 17.1366666667, -61.7925), - ("TBPB", 13.0744444444, -59.4922222222), - ("TDCF", 15.3366666667, -61.3919444444), - ("TDPD", 15.5469444444, -61.3), - ("TFFF", 14.5908333333, -61.0030555556), - ("TFFG", 18.0997222222, -63.0469444444), - ("TFFJ", 17.9, -62.85), - ("TFFM", 15.8686111111, -61.27), - ("TFFR", 16.2652777778, -61.5316666667), - ("TGPY", 12.0041666667, -61.7861111111), - ("TIST", 18.3372222222, -64.9733333333), - ("TISX", 17.7016666667, -64.7983333333), - ("TJBQ", 18.4947222222, -67.1294444444), - ("TJFA", 18.3088888889, -65.6616666667), - ("TJIG", 18.4566666667, -66.0980555556), - ("TJMZ", 18.2555555556, -67.1483333333), - ("TJNR", 18.245, -65.6433333333), - ("TJPS", 18.0080555556, -66.5627777778), - ("TJSJ", 18.4391666667, -66.0016666667), - ("TKPK", 17.3111111111, -62.7186111111), - ("TKPN", 17.2055555556, -62.5897222222), - ("TLPC", 14.02, -60.9927777778), - ("TLPL", 13.7330555556, -60.9525), - ("TNCA", 12.5013888889, -70.015), - ("TNCB", 12.1308333333, -68.2683333333), - ("TNCC", 12.1886111111, -68.9597222222), - ("TNCE", 17.4963888889, -62.9791666667), - ("TNCM", 18.0408333333, -63.1088888889), - ("TQPF", 18.2047222222, -63.055), - ("TRPM", 33.5869444444, -80.2086111111), - ("TTCP", 11.1494444444, -60.8319444444), - ("TTPP", 10.5952777778, -61.3372222222), - ("TUPJ", 18.4447222222, -64.5427777778), - ("TVSB", 12.9883333333, -61.2619444444), - ("TVSC", 12.6988888889, -61.3422222222), - ("TVSM", 12.8875, -61.18), - ("TVSV", 13.1441666667, -61.2108333333), - ("UAAA", 43.3519444444, 77.0402777778), - ("UAAH", 46.8941666667, 75.0047222222), - ("UACC", 51.0222222222, 71.4672222222), - ("UAFM", 43.0616666667, 74.4783333333), - ("UAFO", 40.6088888889, 72.7930555556), - ("UAII", 42.3644444444, 69.4791666667), - ("UAKD", 47.7083333333, 67.7333333333), - ("UARR", 51.1516666667, 51.5455555556), - ("UASS", 50.3511111111, 80.2341666667), - ("UATE", 43.86, 51.0919444444), - ("UATT", 50.245, 57.2033333333), - ("UAUU", 53.2063888889, 63.5508333333), - ("UBBB", 40.4675, 50.0466666667), - ("UEEA", 34.8041666667, -96.6711111111), - ("UEEE", 62.0930555556, 129.770555556), - ("UERP", 66.4166666667, 112.05), - ("UGEE", 40.1483333333, 44.3966666667), - ("UGGG", 41.6691666667, 44.9547222222), - ("UGSS", 42.8580555556, 41.1280555556), - ("UHBB", 50.4216666667, 127.41), - ("UHHH", 48.5277777778, 135.188333333), - ("UHMA", 64.7347222222, 177.741388889), - ("UHMD", 64.38, -173.246666667), - ("UHMM", 59.91, 150.716666667), - ("UHMP", 67.5, 171.0), - ("UHPP", 53.1663888889, 158.452777778), - ("UHSH", 53.515, 142.888333333), - ("UHSS", 46.8886111111, 142.717222222), - ("UHWW", 43.3988888889, 132.151388889), - ("UIAA", 52.0261111111, 113.305), - ("UIBB", 56.3708333333, 101.698611111), - ("UIII", 52.2669444444, 104.394722222), - ("UIUU", 51.8066666667, 107.438055556), - ("UKBB", 50.345, 30.895), - ("UKCC", 48.0733333333, 37.74), - ("UKDD", 48.3566666667, 35.1016666667), - ("UKFF", 45.0386111111, 33.9830555556), - ("UKHH", 49.3588888889, 26.9338888889), - ("UKKK", 50.4016666667, 30.4516666667), - ("UKLL", 49.8125, 23.9561111111), - ("UKLN", 48.26, 25.9816666667), - ("UKOO", 46.4269444444, 30.6780555556), - ("ULLI", 59.8, 30.265), - ("ULMM", 68.7816666667, 32.7505555556), - ("UMGG", 52.5269444444, 31.0166666667), - ("UMII", 55.1666666667, 30.1333333333), - ("UMKK", 54.89, 20.5925), - ("UMMM", 53.8644444444, 27.5394444444), - ("UMMS", 53.8822222222, 28.0305555556), - ("UNAA", 53.74, 91.385), - ("UNBB", 53.3638888889, 83.5419444444), - ("UNEE", 55.2697222222, 86.1069444444), - ("UNOO", 54.9669444444, 73.31), - ("URKK", 45.035, 39.1716666667), - ("URML", 42.8166666667, 47.6522222222), - ("URMM", 44.225, 43.0816666667), - ("URMT", 45.1091666667, 42.1127777778), - ("URRR", 47.2580555556, 39.8177777778), - ("URSS", 43.4458333333, 39.9475), - ("URWA", 46.2833333333, 48.0061111111), - ("URWW", 48.7822222222, 44.3447222222), - ("USCC", 55.3033333333, 61.5066666667), - ("USCM", 53.3933333333, 58.76), - ("USDD", 66.59, 66.6102777778), - ("USNN", 60.95, 76.4666666667), - ("USPP", 57.9166666667, 56.0255555556), - ("USRR", 61.25, 73.5), - ("USSS", 56.7413888889, 60.8036111111), - ("USTO", 37.1322222222, -92.0838888889), - ("USUU", 55.475, 65.4147222222), - ("UTAA", 37.9916666667, 58.3633333333), - ("UTAK", 40.0333333333, 52.9833333333), - ("UTAV", 39.0833333333, 63.6133333333), - ("UTDD", 38.5433333333, 68.825), - ("UTNN", 42.4863888889, 59.6225), - ("UTSB", 39.775, 64.48), - ("UTSS", 39.7005555556, 66.9847222222), - ("UTST", 37.2863888889, 67.3083333333), - ("UTTT", 41.2572222222, 69.2816666667), - ("UUBP", 53.2141666667, 34.1763888889), - ("UUEE", 55.9716666667, 37.415), - ("UUEM", 56.8247222222, 35.7575), - ("UUOO", 51.8141666667, 39.2297222222), - ("UUWW", 55.5913888889, 37.2613888889), - ("UUYY", 61.6475, 50.8455555556), - ("UWKD", 55.6077777778, 49.2772222222), - ("UWOO", 51.7955555556, 55.4566666667), - ("UWPP", 28.9541666667, -98.5197222222), - ("UWUU", 54.5575, 55.8741666667), - ("UWWW", 53.5052777778, 50.1644444444), - ("VAAH", 23.0747222222, 72.6316666667), - ("VAAK", 20.6988888889, 77.0563888889), - ("VAAU", 19.8630555556, 75.3980555556), - ("VABB", 19.0886111111, 72.8677777778), - ("VABI", 21.9886111111, 82.1111111111), - ("VABJ", 23.2877777778, 69.67), - ("VABM", 15.8591666667, 74.6180555556), - ("VABO", 22.3361111111, 73.2261111111), - ("VABP", 23.285, 77.3372222222), - ("VABV", 21.7519444444, 72.185), - ("VADN", 20.435, 72.8436111111), - ("VADS", 24.2677777778, 72.2052777778), - ("VAGO", 15.3805555556, 73.8330555556), - ("VAID", 22.7216666667, 75.8008333333), - ("VAJB", 23.1777777778, 80.0519444444), - ("VAJJ", 19.0980555556, 72.8338888889), - ("VAJM", 22.4663888889, 70.0113888889), - ("VAKE", 23.1125, 70.1002777778), - ("VAKJ", 24.8194444444, 79.9191666667), - ("VAKP", 16.6638888889, 74.2880555556), - ("VAKS", 21.3166666667, 70.27), - ("VANP", 21.0919444444, 79.0469444444), - ("VANR", 19.9625, 73.8069444444), - ("VAPO", 18.5819444444, 73.9194444444), - ("VAPR", 21.6494444444, 69.6563888889), - ("VARK", 22.3091666667, 70.7794444444), - ("VARP", 21.1802777778, 81.7386111111), - ("VASL", 17.6277777778, 75.9347222222), - ("VASU", 21.115, 72.7427777778), - ("VAUD", 24.6175, 73.9127777778), - ("VCBI", 7.18111111111, 79.8836111111), - ("VCCA", 8.30111111111, 80.4280555556), - ("VCCB", 7.70555555556, 81.6777777778), - ("VCCC", 6.82194444444, 79.8861111111), - ("VCCG", 7.3375, 81.6255555556), - ("VCCJ", 9.79222222222, 80.07), - ("VCCT", 8.53888888889, 81.1813888889), - ("VCCW", 6.25444444444, 81.235), - ("VDBG", 13.0955555556, 103.224166667), - ("VDKH", 12.255, 104.563611111), - ("VDPP", 11.5463888889, 104.843888889), - ("VDSR", 13.4105555556, 103.812777778), - ("VDST", 13.5313888889, 106.014166667), - ("VEAN", 28.1747222222, 94.8019444444), - ("VEAT", 23.8888888889, 91.2408333333), - ("VEAZ", 23.7461111111, 92.8030555556), - ("VEBD", 26.6813888889, 88.3280555556), - ("VEBG", 25.2608333333, 88.7955555556), - ("VEBK", 23.6433333333, 86.1486111111), - ("VEBS", 20.2441666667, 85.8177777778), - ("VECC", 22.6547222222, 88.4466666667), - ("VECO", 26.3302777778, 89.4669444444), - ("VEDB", 23.8338888889, 86.425), - ("VEDZ", 27.9888888889, 94.2233333333), - ("VEGK", 26.7394444444, 83.4494444444), - ("VEGT", 26.1061111111, 91.5847222222), - ("VEGY", 24.7480555556, 84.9425), - ("VEHK", 21.5791666667, 84.0061111111), - ("VEIM", 24.7597222222, 93.8969444444), - ("VEJH", 21.9133333333, 84.0502777778), - ("VEJP", 18.8797222222, 82.5519444444), - ("VEJS", 22.8119444444, 86.1675), - ("VEJT", 26.7305555556, 94.1755555556), - ("VEKM", 24.135, 91.8105555556), - ("VEKR", 24.3083333333, 92.0075), - ("VEKU", 24.9127777778, 92.9786111111), - ("VELR", 27.2905555556, 94.0966666667), - ("VEMN", 27.4833333333, 95.0175), - ("VEMZ", 26.12, 85.3130555556), - ("VENP", 20.87, 82.5194444444), - ("VEPG", 28.0661111111, 95.3355555556), - ("VEPH", 23.4744444444, 87.4277777778), - ("VEPT", 25.5905555556, 85.0877777778), - ("VEPU", 25.76, 87.4091666667), - ("VERC", 23.3147222222, 85.3213888889), - ("VERK", 22.2563888889, 84.8144444444), - ("VEUK", 20.0975, 83.1833333333), - ("VEZO", 27.5880555556, 93.8283333333), - ("VGCB", 21.4519444444, 91.9641666667), - ("VGEG", 22.2494444444, 91.8130555556), - ("VGIS", 24.1525, 89.0494444444), - ("VGJR", 23.1836111111, 89.1608333333), - ("VGRJ", 24.4369444444, 88.6163888889), - ("VGSD", 25.7591666667, 88.9086111111), - ("VGSY", 24.9627777778, 91.8672222222), - ("VGTJ", 23.7783333333, 90.3825), - ("VGZR", 23.8433333333, 90.3977777778), - ("VHHH", 22.3088888889, 113.914444444), - ("VHSK", 22.4363888889, 114.080277778), - ("VIAG", 27.1555555556, 77.9608333333), - ("VIAL", 25.4388888889, 81.7341666667), - ("VIAR", 31.7075, 74.7991666667), - ("VIBK", 28.0725, 73.2066666667), - ("VIBL", 26.9883333333, 80.8930555556), - ("VIBN", 25.4519444444, 82.8588888889), - ("VIBR", 31.8816666667, 77.1844444444), - ("VIBT", 30.27, 74.7555555556), - ("VIBW", 28.8375, 76.1775), - ("VIBY", 28.4222222222, 79.4497222222), - ("VICG", 30.6733333333, 76.7883333333), - ("VICX", 26.4041666667, 80.41), - ("VIDD", 28.5841666667, 77.2052777778), - ("VIDN", 30.1872222222, 78.18), - ("VIDP", 28.5663888889, 77.1030555556), - ("VIGN", 24.6544444444, 77.3472222222), - ("VIGR", 26.2938888889, 78.2275), - ("VIHR", 29.1805555556, 75.7530555556), - ("VIJN", 25.4897222222, 78.5594444444), - ("VIJO", 26.2513888889, 73.0480555556), - ("VIJP", 26.8238888889, 75.8097222222), - ("VIJR", 26.8891666667, 70.8644444444), - ("VIJU", 32.6897222222, 74.8380555556), - ("VIKA", 26.4411111111, 80.3633333333), - ("VIKO", 25.1605555556, 75.8447222222), - ("VILD", 30.8544444444, 75.9511111111), - ("VILH", 34.1355555556, 77.5455555556), - ("VILK", 26.7605555556, 80.8863888889), - ("VIPK", 32.2336111111, 75.6344444444), - ("VIPL", 30.315, 76.3633333333), - ("VIPT", 29.0330555556, 79.4736111111), - ("VIRB", 26.2502777778, 81.3805555556), - ("VISM", 31.0816666667, 77.0580555556), - ("VISP", 29.9941666667, 77.4241666667), - ("VISR", 33.9866666667, 74.7736111111), - ("VLHS", 20.2572222222, 100.437222222), - ("VLLB", 19.8972222222, 102.160833333), - ("VLPS", 15.1319444444, 105.781388889), - ("VLPV", 19.4547222222, 103.218055556), - ("VLSK", 16.5563888889, 104.759444444), - ("VLVT", 17.9880555556, 102.563055556), - ("VMMC", 22.1494444444, 113.591388889), - ("VNBW", 27.5055555556, 83.4161111111), - ("VNCG", 26.5705555556, 88.0794444444), - ("VNJP", 26.7086111111, 85.9222222222), - ("VNKT", 27.6963888889, 85.3591666667), - ("VNNG", 28.1036111111, 81.6669444444), - ("VNPK", 28.2002777778, 83.9811111111), - ("VNSI", 27.1594444444, 84.98), - ("VNVT", 26.4833333333, 87.2636111111), - ("VOAT", 10.8233333333, 72.1755555556), - ("VOBG", 12.9497222222, 77.6680555556), - ("VOBR", 17.9077777778, 77.4858333333), - ("VOBZ", 16.5302777778, 80.7966666667), - ("VOCB", 11.0313888889, 77.0438888889), - ("VOCL", 11.1355555556, 75.9547222222), - ("VOCP", 14.5097222222, 78.7727777778), - ("VOCX", 9.15305555556, 92.8191666667), - ("VODG", 17.6291666667, 78.4033333333), - ("VOHY", 17.4522222222, 78.4611111111), - ("VOMD", 9.83444444444, 78.0933333333), - ("VOML", 12.96, 74.8925), - ("VOMM", 12.9941666667, 80.1802777778), - ("VONS", 16.5408333333, 79.3177777778), - ("VOPB", 11.6455555556, 92.7330555556), - ("VORY", 17.1094444444, 81.8183333333), - ("VOSM", 11.7819444444, 78.0652777778), - ("VOTJ", 10.7197222222, 79.1036111111), - ("VOTP", 13.6319444444, 79.5430555556), - ("VOTR", 10.7652777778, 78.7088888889), - ("VOTV", 8.48194444444, 76.9180555556), - ("VOTX", 12.9066666667, 80.1211111111), - ("VOWA", 17.9180555556, 79.5986111111), - ("VQPR", 27.4030555556, 89.4258333333), - ("VRMM", 4.19166666667, 73.5288888889), - ("VTBD", 13.9125, 100.606666667), - ("VTBK", 14.1019444444, 99.9169444444), - ("VTBL", 14.8744444444, 100.663333333), - ("VTBU", 12.6797222222, 101.005), - ("VTBW", 13.7686111111, 102.315277778), - ("VTCB", 19.4972222222, 100.285555556), - ("VTCL", 18.2719444444, 99.5038888889), - ("VTCP", 18.1319444444, 100.164444444), - ("VTPH", 12.6338888889, 99.9508333333), - ("VTPI", 15.2772222222, 100.295833333), - ("VTPL", 16.8208333333, 101.253888889), - ("VTPM", 16.6997222222, 98.545), - ("VTPN", 15.6727777778, 100.136666667), - ("VTPP", 16.7827777778, 100.278888889), - ("VTPU", 17.6736111111, 100.234722222), - ("VTPY", 17.2341666667, 99.0577777778), - ("VTSC", 6.51972222222, 101.743333333), - ("VTSG", 8.09888888889, 98.9861111111), - ("VTSH", 7.18638888889, 100.607777778), - ("VTSK", 6.78527777778, 101.153333333), - ("VTSM", 9.54777777778, 100.062222222), - ("VTSN", 8.47111111111, 99.9555555556), - ("VTSP", 8.11305555556, 98.3166666667), - ("VTSR", 9.7775, 98.5852777778), - ("VTSS", 6.93305555556, 100.392777778), - ("VTST", 7.50861111111, 99.6163888889), - ("VTSY", 6.52666666667, 101.241944444), - ("VTUD", 17.3863888889, 102.788055556), - ("VTUI", 17.195, 104.118611111), - ("VTUJ", 14.8691666667, 103.488888889), - ("VTUL", 17.4388888889, 101.721944444), - ("VTUN", 14.9341666667, 102.078611111), - ("VTUP", 17.4125, 104.777222222), - ("VTUW", 17.3836111111, 104.642777778), - ("VVDN", 16.0438888889, 108.199166667), - ("VVNB", 21.2216666667, 105.805555556), - ("VVNT", 12.2180555556, 109.2), - ("VVTS", 10.82, 106.661666667), - ("VYBG", 21.1819444444, 94.9291666667), - ("VYBM", 24.2688888889, 97.2461111111), - ("VYCI", 14.1413888889, 93.3683333333), - ("VYDW", 14.0980555556, 98.2016666667), - ("VYHH", 20.7430555556, 96.7916666667), - ("VYKG", 21.3005555556, 99.6366666667), - ("VYKL", 23.1886111111, 94.0508333333), - ("VYKP", 19.4266666667, 93.5344444444), - ("VYKT", 10.0491666667, 98.5377777778), - ("VYLK", 19.6922222222, 97.2147222222), - ("VYLS", 22.9775, 97.7522222222), - ("VYLY", 20.9402777778, 94.8225), - ("VYMD", 21.7019444444, 95.9777777778), - ("VYME", 12.4433333333, 98.6211111111), - ("VYMK", 25.3825, 97.3527777778), - ("VYMM", 16.4447222222, 97.6605555556), - ("VYMO", 23.0925, 96.645), - ("VYMS", 20.5166666667, 99.2566666667), - ("VYNP", 25.3541666667, 97.295), - ("VYNS", 20.89, 97.7361111111), - ("VYPA", 16.8944444444, 97.6752777778), - ("VYPN", 16.8127777778, 94.7752777778), - ("VYPT", 27.3297222222, 97.4261111111), - ("VYPY", 18.8244444444, 95.2658333333), - ("VYST", 20.9416666667, 95.9144444444), - ("VYSW", 20.1325, 92.8725), - ("VYTD", 18.4605555556, 94.2994444444), - ("VYTL", 20.4836111111, 99.9352777778), - ("VYTO", 19.0311111111, 96.4013888889), - ("VYYY", 16.9072222222, 96.1330555556), - ("WAAA", -5.06166666667, 119.553888889), - ("WAAL", -4.31666666667, 122.466666667), - ("WAAM", -2.55777777778, 120.324166667), - ("WAAS", -2.52944444444, 121.357222222), - ("WAAT", -3.045, 119.821666667), - ("WAAU", -4.08222222222, 122.416666667), - ("WABB", -1.19, 136.107777778), - ("WABI", -3.36805555556, 135.496388889), - ("WABP", -4.52805555556, 136.887222222), - ("WAJJ", -2.57694444444, 140.516111111), - ("WAJW", -4.09611111111, 138.9525), - ("WAKK", -8.52027777778, 140.418333333), - ("WAMG", 0.636666666667, 122.851944444), - ("WAMH", 3.68305555556, 125.527777778), - ("WAML", -0.918333333333, 119.909444444), - ("WAMM", 1.54916666667, 124.926388889), - ("WAMP", -1.41666666667, 120.6575), - ("WAMT", 0.831944444444, 127.380555556), - ("WAMW", -1.03888888889, 122.771666667), - ("WAPL", -5.66138888889, 132.731388889), - ("WAPP", -3.70888888889, 128.09), - ("WASK", -3.64388888889, 133.695277778), - ("WASR", -0.88, 134.050277778), - ("WASS", -0.925833333333, 131.12), - ("WBGB", 3.17222222222, 113.044444444), - ("WBGG", 1.48472222222, 110.346388889), - ("WBGM", 4.17805555556, 114.331388889), - ("WBGR", 4.325, 113.988333333), - ("WBGS", 2.26388888889, 111.982777778), - ("WBKD", 5.03222222222, 118.323888889), - ("WBKK", 5.93722222222, 116.051111111), - ("WBKL", 5.30055555556, 115.25), - ("WBKW", 4.31333333333, 118.121944444), - ("WBSB", 4.94555555556, 114.927777778), - ("WIAA", 5.87388888889, 95.3394444444), - ("WIAM", -7.34555555556, 108.246388889), - ("WIAR", -7.61583333333, 111.433888889), - ("WIAS", -7.92611111111, 112.713888889), - ("WIBB", 0.461111111111, 101.444444444), - ("WIBD", 1.60916666667, 101.433333333), - ("WIIA", -6.29305555556, 106.569722222), - ("WIIB", -6.90055555556, 107.576111111), - ("WIIC", -6.75583333333, 108.539444444), - ("WIIH", -6.26638888889, 106.891111111), - ("WIII", -6.12555555556, 106.655833333), - ("WIIJ", -7.78805555556, 110.431944444), - ("WIIL", -7.645, 109.033888889), - ("WIIP", -6.33694444444, 106.764444444), - ("WIIS", -6.97305555556, 110.375277778), - ("WIIT", -5.24222222222, 105.178888889), - ("WIKB", 1.12083333333, 104.118611111), - ("WIKD", -2.74555555556, 107.754722222), - ("WIKK", -2.16277777778, 106.139166667), - ("WIKN", 0.9225, 104.532222222), - ("WIKS", -0.479166666667, 104.579166667), - ("WIMB", 1.16638888889, 97.7027777778), - ("WIME", 1.39916666667, 99.4319444444), - ("WIMG", -0.876111111111, 100.3525), - ("WIMM", 3.55805555556, 98.6716666667), - ("WIMS", 1.55472222222, 98.8902777778), - ("WIOG", -0.348611111111, 111.7475), - ("WIOK", -1.81638888889, 109.963333333), - ("WION", 3.90861111111, 108.387777778), - ("WIOO", -0.150555555556, 109.403888889), - ("WIOP", 0.835833333333, 112.935555556), - ("WIOS", 0.0636111111111, 111.474722222), - ("WIPA", -1.63777777778, 103.644166667), - ("WIPL", -3.86388888889, 102.340833333), - ("WIPP", -2.89777777778, 104.701111111), - ("WIPQ", -3.28583333333, 103.879444444), - ("WIPR", -0.352777777778, 102.334722222), - ("WIPU", -2.54222222222, 101.088333333), - ("WITL", 5.06944444444, 97.2591666667), - ("WITM", 5.22666666667, 96.9502777778), - ("WITT", 5.52333333333, 95.4202777778), - ("WMAP", 2.04138888889, 103.307222222), - ("WMBT", 2.81805555556, 104.16), - ("WMKA", 6.19388888889, 100.4025), - ("WMKB", 5.46583333333, 100.391111111), - ("WMKC", 6.16638888889, 102.293611111), - ("WMKD", 3.77527777778, 103.208888889), - ("WMKE", 4.53722222222, 103.426388889), - ("WMKF", 3.11222222222, 101.7025), - ("WMKI", 4.56777777778, 101.091944444), - ("WMKJ", 1.64111111111, 103.669444444), - ("WMKK", 2.74555555556, 101.709722222), - ("WMKL", 6.32972222222, 99.7286111111), - ("WMKM", 2.26333333333, 102.251388889), - ("WMKN", 5.3825, 103.103333333), - ("WMKP", 5.29694444444, 100.276666667), - ("WPDB", -9.30305555556, 125.286666667), - ("WPEC", -8.48527777778, 126.398888889), - ("WRBB", -3.44194444444, 114.761111111), - ("WRBC", -3.4125, 115.995555556), - ("WRBI", -2.705, 111.673055556), - ("WRBP", -2.225, 113.9425), - ("WRBS", -2.50111111111, 112.976944444), - ("WRKC", -8.64055555556, 122.236666667), - ("WRKE", -8.84888888889, 121.661944444), - ("WRKG", -8.59555555556, 120.4775), - ("WRKK", -10.1713888889, 123.671111111), - ("WRKO", -8.48611111111, 119.889166667), - ("WRLK", 2.15444444444, 117.432222222), - ("WRLL", -1.26805555556, 116.894444444), - ("WRLR", 3.32638888889, 117.566388889), - ("WRLS", -0.484444444444, 117.156944444), - ("WRLT", -0.0930555555556, 117.439166667), - ("WRRA", -8.56055555556, 116.094444444), - ("WRRB", -8.53944444444, 118.687222222), - ("WRRR", -8.74833333333, 115.167222222), - ("WRRS", -8.48888888889, 117.411944444), - ("WRRT", -9.40944444444, 119.246111111), - ("WRRW", -9.67, 120.303611111), - ("WRSJ", -7.37972222222, 112.786666667), - ("WRSQ", -7.51583333333, 110.756666667), - ("WSAG", 1.42361111111, 103.811388889), - ("WSAP", 1.36027777778, 103.909444444), - ("WSAT", 1.38722222222, 103.708611111), - ("WSSL", 1.41694444444, 103.8675), - ("WSSS", 1.35555555556, 103.987222222), - ("YBAF", -27.5702777778, 153.008055556), - ("YBAM", -10.9508333333, 142.459444444), - ("YBAS", -23.8069444444, 133.902222222), - ("YBBN", -27.3841666667, 153.1175), - ("YBCG", -28.1644444444, 153.504722222), - ("YBCS", -16.8858333333, 145.755277778), - ("YBCV", -26.4133333333, 146.2625), - ("YBMA", -20.6638888889, 139.488611111), - ("YBMC", -26.6033333333, 153.091111111), - ("YBMK", -21.1716666667, 149.179722222), - ("YBOK", -27.4113888889, 151.735277778), - ("YBPN", -20.495, 148.552222222), - ("YBRK", -23.3819444444, 150.475277778), - ("YBTL", -19.2525, 146.765277778), - ("YBWP", -12.6786111111, 141.925277778), - ("YMAV", -38.0394444444, 144.469444444), - ("YMAY", -36.0677777778, 146.958055556), - ("YMEN", -37.7280555556, 144.901944444), - ("YMES", -38.0988888889, 147.149444444), - ("YMHB", -42.8361111111, 147.510277778), - ("YMLT", -41.5452777778, 147.214166667), - ("YMMB", -37.9758333333, 145.102222222), - ("YMML", -37.6733333333, 144.843333333), - ("YMPC", -37.9322222222, 144.753333333), - ("YPAD", -34.945, 138.530555556), - ("YPAG", -32.5069444444, 137.716666667), - ("YPED", -34.7025, 138.620833333), - ("YPJT", -32.0972222222, 115.881111111), - ("YPKA", -20.7122222222, 116.773333333), - ("YPKG", -30.7894444444, 121.461666667), - ("YPKU", -15.7780555556, 128.7075), - ("YPLM", -22.2355555556, 114.088611111), - ("YPPD", -20.3777777778, 118.626388889), - ("YPPF", -34.7933333333, 138.633055556), - ("YPPH", -31.9402777778, 115.966944444), - ("YPWR", -31.1441666667, 136.816944444), - ("YPXM", -10.4505555556, 105.690277778), - ("YSBK", -33.9244444444, 150.988333333), - ("YSCB", -35.3083333333, 149.193888889), - ("YSCH", -30.3205555556, 153.116388889), - ("YSCN", -34.0402777778, 150.687222222), - ("YSDU", -32.2166666667, 148.574722222), - ("YSNF", -29.0413888889, 167.938611111), - ("YSRI", -33.6005555556, 150.780833333), - ("YSSY", -33.9461111111, 151.177222222), - ("YSTW", -31.0838888889, 150.846666667), - ("YSWG", -35.1652777778, 147.466388889), - ("ZBAA", 40.08, 116.584444444), - ("ZBHH", 40.8533333333, 111.821666667), - ("ZBLA", 49.205, 119.825), - ("ZBSJ", 38.2805555556, 114.696388889), - ("ZBTJ", 39.1238888889, 117.346111111), - ("ZBYN", 37.7466666667, 112.628611111), - ("ZGGG", 23.1841666667, 113.265833333), - ("ZGHA", 28.1888888889, 113.219444444), - ("ZGKL", 25.2177777778, 110.039166667), - ("ZGNN", 22.6080555556, 108.172222222), - ("ZGOW", 23.4, 116.683333333), - ("ZGSZ", 22.6394444444, 113.812222222), - ("ZHCC", 34.5194444444, 113.840833333), - ("ZHHH", 30.7836111111, 114.208055556), - ("ZHYC", 30.5522222222, 111.468611111), - ("ZKPY", 39.0333333333, 125.783333333), - ("ZLLL", 36.5166666667, 103.621666667), - ("ZLXY", 34.4458333333, 108.7525), - ("ZMUB", 47.8430555556, 106.766388889), - ("ZPJH", 21.975, 100.76), - ("ZPPP", 24.9922222222, 102.743333333), - ("ZSAM", 24.5438888889, 118.1275), - ("ZSCN", 28.6, 115.916666667), - ("ZSFZ", 25.9333333333, 119.661666667), - ("ZSHC", 30.2283333333, 120.431666667), - ("ZSNB", 29.8247222222, 121.465), - ("ZSNJ", 31.74, 118.86), - ("ZSOF", 31.78, 117.298333333), - ("ZSQD", 36.2625, 120.375277778), - ("ZSSS", 31.1977777778, 121.336111111), - ("ZSYT", 37.4016666667, 121.371666667), - ("ZUCK", 29.7188888889, 106.641388889), - ("ZUUU", 30.5783333333, 103.946944444), - ("ZUXC", 27.9886111111, 102.184166667), - ("ZWSH", 39.5433333333, 76.0216666667), - ("ZWTN", 37.0377777778, 79.8658333333), - ("ZWWW", 43.9069444444, 87.4741666667), - ("ZYHB", 45.6233333333, 126.250277778), - ("ZYJM", 46.8433333333, 130.465277778), - ("ZYMD", 44.5238888889, 129.568888889), - ("ZYTL", 38.9655555556, 121.538333333), - ("ZYYJ", 42.8816666667, 129.448333333) + ("AYGA", -6.08166666667, 145.391666667), + ("AYMD", -5.20694444444, 145.788611111), + ("AYMH", -5.82611111111, 144.296111111), + ("AYNZ", -6.56972222222, 146.726111111), + ("AYPY", -9.44333333333, 147.22), + ("AYWK", -3.58361111111, 143.669166667), + ("BGBW", 61.1611111111, -45.4275), + ("BGCO", 70.7394444444, -22.6458333333), + ("BGGH", 64.1908333333, -51.6780555556), + ("BGJN", 69.2333333333, -51.0666666667), + ("BGKK", 65.5833333333, -37.15), + ("BGSF", 67.0169444444, -50.6891666667), + ("BGTL", 76.5311111111, -68.7030555556), + ("BIAR", 65.6597222222, -18.0725), + ("BIEG", 65.2833333333, -14.4013888889), + ("BIHN", 64.2955555556, -15.2272222222), + ("BIHU", 65.9522222222, -17.4258333333), + ("BIIS", 66.0580555556, -23.1352777778), + ("BIKF", 63.985, -22.6055555556), + ("BIKP", 66.3136111111, -16.4611111111), + ("BIPA", 65.5558333333, -23.965), + ("BIRK", 64.13, -21.9405555556), + ("BISI", 66.1333333333, -18.9166666667), + ("BIVM", 63.4241666667, -20.2786111111), + ("CYAM", 46.485, -84.5094444444), + ("CYAV", 50.0563888889, -97.0325), + ("CYAW", 44.6397222222, -63.4994444444), + ("CYAY", 51.3916666667, -56.0844444444), + ("CYAZ", 49.0822222222, -125.7725), + ("CYBB", 68.5344444444, -89.8080555556), + ("CYBC", 49.1322222222, -68.2072222222), + ("CYBG", 48.3305555556, -70.9963888889), + ("CYBK", 64.2988888889, -96.0777777778), + ("CYBL", 49.9508333333, -125.270833333), + ("CYBR", 49.91, -99.9519444444), + ("CYCB", 69.1080555556, -105.138333333), + ("CYCD", 49.0522222222, -123.87), + ("CYCG", 49.2963888889, -117.6325), + ("CYCH", 47.0077777778, -65.4491666667), + ("CYCL", 47.9905555556, -66.3313888889), + ("CYCO", 67.8166666667, -115.143888889), + ("CYCT", 52.075, -111.445277778), + ("CYCW", 49.1527777778, -121.938888889), + ("CYCY", 70.4861111111, -68.5166666667), + ("CYCZ", 50.3319444444, -115.873611111), + ("CYDA", 64.0430555556, -139.127777778), + ("CYDB", 61.3711111111, -139.040555556), + ("CYDC", 49.4675, -120.511944444), + ("CYDF", 49.2108333333, -57.3913888889), + ("CYDL", 58.4222222222, -130.032222222), + ("CYDN", 51.1008333333, -100.0525), + ("CYDQ", 55.7416666667, -120.181944444), + ("CYED", 53.6666666667, -113.466666667), + ("CYEG", 53.3097222222, -113.579722222), + ("CYEK", 61.0941666667, -94.0708333333), + ("CYEN", 49.2102777778, -102.965833333), + ("CYET", 53.5788888889, -116.465), + ("CYEU", 79.9947222222, -85.8133333333), + ("CYEV", 68.3041666667, -133.482777778), + ("CYFB", 63.7563888889, -68.5558333333), + ("CYFC", 45.8694444444, -66.5316666667), + ("CYFE", 48.7461111111, -69.0972222222), + ("CYFO", 54.6780555556, -101.681666667), + ("CYFR", 61.1808333333, -113.689722222), + ("CYFS", 61.7602777778, -121.236666667), + ("CYGK", 44.2252777778, -76.5969444444), + ("CYGL", 53.6252777778, -77.7041666667), + ("CYGP", 48.7752777778, -64.4786111111), + ("CYGQ", 49.7783333333, -86.9394444444), + ("CYGR", 47.4247222222, -61.7780555556), + ("CYGW", 55.2833333333, -77.7666666667), + ("CYGX", 56.35, -94.7), + ("CYHB", 52.8166666667, -102.311388889), + ("CYHD", 49.8316666667, -92.7441666667), + ("CYHI", 70.7630555556, -117.805833333), + ("CYHK", 68.6355555556, -95.8497222222), + ("CYHM", 43.1730555556, -79.935), + ("CYHU", 45.5175, -73.4169444444), + ("CYHY", 60.8397222222, -115.782777778), + ("CYHZ", 44.8808333333, -63.5086111111), + ("CYIB", 48.7738888889, -91.6386111111), + ("CYIO", 72.6833333333, -77.9666666667), + ("CYJN", 45.2944444444, -73.2811111111), + ("CYJT", 48.5441666667, -58.55), + ("CYKA", 50.7022222222, -120.441944444), + ("CYKF", 43.4588888889, -80.3844444444), + ("CYKL", 54.805, -66.8052777778), + ("CYKY", 51.5175, -109.180833333), + ("CYKZ", 43.8622222222, -79.37), + ("CYLD", 47.82, -83.3463888889), + ("CYLJ", 54.1252777778, -108.522777778), + ("CYLL", 53.3091666667, -110.0725), + ("CYLT", 82.5177777778, -62.2805555556), + ("CYLW", 49.9561111111, -119.377777778), + ("CYMA", 63.6166666667, -135.866666667), + ("CYMJ", 50.3302777778, -105.559166667), + ("CYMM", 56.6533333333, -111.221944444), + ("CYMO", 51.2911111111, -80.6077777778), + ("CYMW", 46.2744444444, -75.99), + ("CYMX", 45.6797222222, -74.0386111111), + ("CYNA", 50.1897222222, -61.7891666667), + ("CYND", 45.5213888889, -75.5641666667), + ("CYNM", 49.7616666667, -77.8027777778), + ("CYOC", 67.5705555556, -139.839166667), + ("CYOD", 54.405, -110.279444444), + ("CYOJ", 58.6213888889, -117.164722222), + ("CYOW", 45.3225, -75.6691666667), + ("CYPA", 53.2141666667, -105.672777778), + ("CYPE", 56.2269444444, -117.447222222), + ("CYPG", 49.9027777778, -98.2747222222), + ("CYPK", 49.2161111111, -122.71), + ("CYPL", 51.4463888889, -90.2141666667), + ("CYPN", 49.8363888889, -64.2886111111), + ("CYPQ", 44.23, -78.3633333333), + ("CYPR", 54.2861111111, -130.444722222), + ("CYPY", 58.7672222222, -111.117222222), + ("CYQA", 44.9747222222, -79.3033333333), + ("CYQB", 46.7883333333, -71.3975), + ("CYQF", 52.1786111111, -113.893055556), + ("CYQG", 42.2755555556, -82.9555555556), + ("CYQH", 60.1177777778, -128.821944444), + ("CYQK", 49.7883333333, -94.3630555556), + ("CYQL", 49.6302777778, -112.799722222), + ("CYQM", 46.1122222222, -64.6786111111), + ("CYQN", 50.1827777778, -86.6963888889), + ("CYQQ", 49.7108333333, -124.886666667), + ("CYQR", 50.4319444444, -104.665833333), + ("CYQT", 48.3719444444, -89.3238888889), + ("CYQU", 55.1797222222, -118.885), + ("CYQV", 51.2647222222, -102.461666667), + ("CYQW", 52.7691666667, -108.243611111), + ("CYQX", 48.9369444444, -54.5680555556), + ("CYQY", 46.1613888889, -60.0477777778), + ("CYQZ", 53.0261111111, -122.51), + ("CYRB", 74.7169444444, -94.9694444444), + ("CYRI", 47.7644444444, -69.5847222222), + ("CYRJ", 48.52, -72.2655555556), + ("CYRM", 52.4297222222, -114.904166667), + ("CYRT", 62.8113888889, -92.1158333333), + ("CYSB", 46.625, -80.7988888889), + ("CYSC", 45.4380555556, -71.6905555556), + ("CYSJ", 45.3161111111, -65.8902777778), + ("CYSM", 60.0222222222, -111.960277778), + ("CYSR", 72.9822222222, -84.6136111111), + ("CYSU", 46.4427777778, -63.8311111111), + ("CYSY", 71.9938888889, -125.2425), + ("CYTE", 64.23, -76.5266666667), + ("CYTH", 55.8011111111, -97.8641666667), + ("CYTR", 44.1188888889, -77.5280555556), + ("CYTS", 48.5697222222, -81.3766666667), + ("CYTZ", 43.6275, -79.3961111111), + ("CYUB", 69.4333333333, -133.026388889), + ("CYUL", 45.4680555556, -73.7413888889), + ("CYUT", 66.5213888889, -86.2247222222), + ("CYUX", 68.7761111111, -81.2436111111), + ("CYUY", 48.2061111111, -78.8355555556), + ("CYVC", 55.1513888889, -105.261944444), + ("CYVG", 53.3558333333, -110.823888889), + ("CYVM", 67.5458333333, -64.0313888889), + ("CYVO", 48.0533333333, -77.7827777778), + ("CYVP", 58.0961111111, -68.4269444444), + ("CYVQ", 65.2825, -126.800277778), + ("CYVR", 49.195, -123.181944444), + ("CYVT", 55.8419444444, -108.4175), + ("CYVV", 44.7458333333, -81.1072222222), + ("CYWA", 45.9522222222, -77.3191666667), + ("CYWG", 49.91, -97.2344444444), + ("CYWK", 52.9219444444, -66.8644444444), + ("CYWL", 52.1830555556, -122.054166667), + ("CYWY", 63.2094444444, -123.436666667), + ("CYXC", 49.6102777778, -115.7825), + ("CYXD", 53.5725, -113.520555556), + ("CYXE", 52.1708333333, -106.699722222), + ("CYXH", 50.0188888889, -110.720833333), + ("CYXJ", 56.2380555556, -120.740277778), + ("CYXL", 50.1144444444, -91.9041666667), + ("CYXP", 66.145, -65.7136111111), + ("CYXR", 47.695, -79.8488888889), + ("CYXS", 53.8894444444, -122.678888889), + ("CYXT", 54.4663888889, -128.5775), + ("CYXU", 43.0355555556, -81.1538888889), + ("CYXX", 49.0252777778, -122.363333333), + ("CYXY", 60.7094444444, -135.068333333), + ("CYYB", 46.3636111111, -79.4227777778), + ("CYYC", 51.1138888889, -114.020277778), + ("CYYD", 54.8247222222, -127.182777778), + ("CYYE", 58.8363888889, -122.596944444), + ("CYYF", 49.4627777778, -119.602222222), + ("CYYG", 46.29, -63.1211111111), + ("CYYH", 69.5466666667, -93.5766666667), + ("CYYJ", 48.6469444444, -123.425833333), + ("CYYL", 56.8638888889, -101.076111111), + ("CYYN", 50.2919444444, -107.690555556), + ("CYYQ", 58.7391666667, -94.065), + ("CYYR", 53.3191666667, -60.4258333333), + ("CYYT", 47.6186111111, -52.7519444444), + ("CYYU", 49.4138888889, -82.4675), + ("CYYW", 50.2902777778, -88.9097222222), + ("CYYY", 48.6086111111, -68.2080555556), + ("CYYZ", 43.6772222222, -79.6305555556), + ("CYZD", 43.7425, -79.4655555556), + ("CYZE", 45.8852777778, -82.5677777778), + ("CYZF", 62.4627777778, -114.440277778), + ("CYZH", 55.2933333333, -114.778333333), + ("CYZP", 53.2541666667, -131.813888889), + ("CYZR", 42.9994444444, -82.3088888889), + ("CYZT", 50.6805555556, -127.366666667), + ("CYZU", 54.1438888889, -115.786666667), + ("CYZV", 50.2233333333, -66.2655555556), + ("CYZW", 60.1727777778, -132.742777778), + ("CYZX", 44.9844444444, -64.9169444444), + ("CZFA", 62.2075, -133.375833333), + ("CZFM", 67.4077777778, -134.860277778), + ("DAAB", 36.5036111111, 2.81416666667), + ("DAAD", 35.3325, 4.20638888889), + ("DAAE", 36.7119444444, 5.06972222222), + ("DAAG", 36.6908333333, 3.21527777778), + ("DAAJ", 24.2925, 9.45222222222), + ("DAAK", 36.5458333333, 2.87611111111), + ("DAAM", 36.1086111111, 6.36444444444), + ("DAAN", 26.71, 0.285555555556), + ("DAAP", 26.5733333333, 8.48361111111), + ("DAAQ", 35.5252777778, 2.87861111111), + ("DAAS", 36.1780555556, 5.32444444444), + ("DAAT", 22.8108333333, 5.45083333333), + ("DAAV", 36.795, 5.87333333333), + ("DAAY", 33.5358333333, -0.242222222222), + ("DAAZ", 35.7522222222, 0.626111111111), + ("DABB", 36.8222222222, 7.80916666667), + ("DABC", 36.2766666667, 6.62388888889), + ("DABS", 35.4313888889, 8.12055555556), + ("DAFH", 32.9297222222, 3.31222222222), + ("DAOB", 35.3411111111, 1.46305555556), + ("DAOE", 35.7352777778, -0.805277777778), + ("DAOF", 27.7002777778, -8.16694444444), + ("DAOI", 36.2125, 1.33166666667), + ("DAOL", 35.5422222222, -0.532222222222), + ("DAON", 35.0166666667, -1.45), + ("DAOO", 35.6236111111, -0.621111111111), + ("DAOS", 35.1716666667, -0.593055555556), + ("DAOV", 35.2075, 0.146944444444), + ("DAUA", 27.8375, -0.186388888889), + ("DAUB", 34.7930555556, 5.73805555556), + ("DAUE", 30.5711111111, 2.85944444444), + ("DAUG", 32.3838888889, 3.79388888889), + ("DAUH", 31.6727777778, 6.14027777778), + ("DAUI", 27.2508333333, 2.51194444444), + ("DAUK", 33.0677777778, 6.08861111111), + ("DAUL", 33.7638888889, 2.92722222222), + ("DAUT", 29.2369444444, 0.275833333333), + ("DAUU", 31.9172222222, 5.41277777778), + ("DAUZ", 28.0513888889, 9.64277777778), + ("DBBB", 6.35722222222, 2.38416666667), + ("DBBP", 9.35694444444, 2.60888888889), + ("DFFD", 12.3530555556, -1.51222222222), + ("DFOO", 11.16, -4.33083333333), + ("DGAA", 5.60277777778, -0.168055555556), + ("DGLE", 9.56333333333, -0.863333333333), + ("DGLW", 10.0825, -2.5075), + ("DGSN", 7.36166666667, -2.32861111111), + ("DGTK", 4.89333333333, -1.775), + ("DIAP", 5.25972222222, -3.92638888889), + ("DIBK", 7.73861111111, -5.07361111111), + ("DIDL", 6.7925, -6.47305555556), + ("DIKO", 9.38694444444, -5.55638888889), + ("DIMN", 7.27194444444, -7.58694444444), + ("DISP", 4.74666666667, -6.66055555556), + ("DIYO", 6.90305555556, -5.36583333333), + ("DNAA", 9.00666666667, 7.26305555556), + ("DNAK", 7.24666666667, 5.30083333333), + ("DNBE", 6.31722222222, 5.59944444444), + ("DNCA", 4.97583333333, 8.34694444444), + ("DNEN", 6.47416666667, 7.56194444444), + ("DNGU", 12.1716666667, 6.69611111111), + ("DNIB", 7.36222222222, 3.97833333333), + ("DNIL", 8.44, 4.49388888889), + ("DNJO", 9.63972222222, 8.86888888889), + ("DNKA", 10.6958333333, 7.32), + ("DNKN", 12.0475, 8.52444444444), + ("DNMA", 11.8552777778, 13.0808333333), + ("DNMK", 7.70361111111, 8.61388888889), + ("DNMM", 6.57722222222, 3.32111111111), + ("DNMN", 9.65194444444, 6.46222222222), + ("DNPO", 5.01527777778, 6.94944444444), + ("DNSO", 12.9161111111, 5.20694444444), + ("DNYO", 9.26027777778, 12.4297222222), + ("DNZA", 11.13, 7.68555555556), + ("DRRM", 13.5025, 7.12666666667), + ("DRRN", 13.4813888889, 2.18361111111), + ("DRRT", 14.8755555556, 5.26527777778), + ("DRZA", 16.9647222222, 7.99694444444), + ("DRZD", 18.9686111111, 12.8686111111), + ("DRZF", 13.3727777778, 12.6266666667), + ("DRZR", 13.7788888889, 8.98361111111), + ("DRZT", 14.9994444444, 8.76694444444), + ("DTMB", 35.7580555556, 10.7547222222), + ("DTTA", 36.8508333333, 10.2269444444), + ("DTTB", 37.2452777778, 9.79138888889), + ("DTTD", 32.3061111111, 10.3819444444), + ("DTTF", 34.4219444444, 8.8225), + ("DTTG", 33.8766666667, 10.1033333333), + ("DTTI", 36.7211111111, 9.94305555556), + ("DTTJ", 33.875, 10.7752777778), + ("DTTR", 31.7041666667, 9.25444444444), + ("DTTX", 34.7177777778, 10.6908333333), + ("DTTZ", 33.9397222222, 8.11055555556), + ("DXNG", 9.76722222222, 1.09111111111), + ("DXXX", 6.16555555556, 1.25388888889), + ("EBAW", 51.19, 4.46277777778), + ("EBBE", 50.7586111111, 4.76833333333), + ("EBBL", 51.1677777778, 5.47083333333), + ("EBBR", 50.9022222222, 4.49861111111), + ("EBBT", 51.3333333333, 4.5), + ("EBBX", 49.8872222222, 5.22861111111), + ("EBCI", 50.4591666667, 4.45361111111), + ("EBCV", 50.5758333333, 3.83083333333), + ("EBFN", 51.09, 2.65277777778), + ("EBFS", 50.2436111111, 4.64861111111), + ("EBKT", 50.8177777778, 3.20833333333), + ("EBLG", 50.6372222222, 5.44305555556), + ("EBOS", 51.1988888889, 2.86222222222), + ("EBSL", 50.9483333333, 5.59166666667), + ("EBST", 50.7883333333, 5.19277777778), + ("EBUL", 51.1438888889, 3.47416666667), + ("EBWE", 51.395, 4.96055555556), + ("EBZR", 51.2655555556, 4.75472222222), + ("EDAB", 51.1933333333, 14.5197222222), + ("EDAC", 50.9816666667, 12.5061111111), + ("EDAD", 51.8319444444, 12.1858333333), + ("EDAE", 52.1972222222, 14.5855555556), + ("EDAH", 53.8786111111, 14.1522222222), + ("EDAK", 51.3080555556, 13.5547222222), + ("EDAM", 51.3627777778, 11.9408333333), + ("EDAQ", 51.5519444444, 12.0525), + ("EDAU", 51.2944444444, 13.3588888889), + ("EDAX", 53.3063888889, 12.7530555556), + ("EDAY", 52.5797222222, 13.9155555556), + ("EDAZ", 52.2033333333, 13.1586111111), + ("EDBC", 51.8558333333, 11.4180555556), + ("EDBG", 35.4605555556, -77.9647222222), + ("EDBH", 54.3380555556, 12.71), + ("EDBJ", 50.9172222222, 11.7136111111), + ("EDBK", 52.9186111111, 12.4252777778), + ("EDBM", 52.0736111111, 11.6263888889), + ("EDBN", 51.3280555556, 12.6566666667), + ("EDBR", 51.3644444444, 14.9519444444), + ("EDCA", 53.8325, 13.6688888889), + ("EDCD", 51.8894444444, 14.5316666667), + ("EDCK", 51.7211111111, 11.9616666667), + ("EDCM", 51.2961111111, 14.1288888889), + ("EDDB", 52.38, 13.5225), + ("EDDC", 51.1325, 13.7669444444), + ("EDDE", 50.98, 10.9580555556), + ("EDDF", 50.0263888889, 8.54305555556), + ("EDDG", 52.1344444444, 7.68472222222), + ("EDDH", 53.6302777778, 9.98805555556), + ("EDDI", 52.4727777778, 13.4038888889), + ("EDDK", 50.8658333333, 7.1425), + ("EDDL", 51.2894444444, 6.76666666667), + ("EDDM", 48.3536111111, 11.7858333333), + ("EDDN", 49.4986111111, 11.0780555556), + ("EDDP", 51.4238888889, 12.2361111111), + ("EDDR", 49.2144444444, 7.10944444444), + ("EDDS", 48.6897222222, 9.22194444444), + ("EDDT", 52.5594444444, 13.2875), + ("EDDV", 52.4608333333, 9.685), + ("EDDW", 53.0475, 8.78666666667), + ("EDFE", 49.9608333333, 8.64361111111), + ("EDFH", 49.9497222222, 7.26388888889), + ("EDFM", 49.4725, 8.51361111111), + ("EDFQ", 51.0352777778, 8.67888888889), + ("EDFV", 49.6063888889, 8.36833333333), + ("EDFZ", 49.9688888889, 8.1475), + ("EDGE", 50.9927777778, 10.4725), + ("EDGS", 50.7075, 8.08194444444), + ("EDHI", 53.5352777778, 9.83527777778), + ("EDHK", 54.3794444444, 10.145), + ("EDHL", 53.8052777778, 10.7191666667), + ("EDKA", 50.8227777778, 6.18722222222), + ("EDKV", 50.4058333333, 6.52805555556), + ("EDKZ", 51.0994444444, 7.60194444444), + ("EDLA", 51.4833333333, 7.89916666667), + ("EDLC", 51.5302777778, 6.53694444444), + ("EDLE", 51.4013888889, 6.93583333333), + ("EDLN", 51.2302777778, 6.50444444444), + ("EDLP", 51.6141666667, 8.61611111111), + ("EDLS", 51.9958333333, 6.84027777778), + ("EDLW", 51.5180555556, 7.61222222222), + ("EDMA", 48.425, 10.9316666667), + ("EDMB", 48.1108333333, 9.76277777778), + ("EDME", 48.3961111111, 12.7236111111), + ("EDMO", 48.0813888889, 11.2833333333), + ("EDMS", 48.9008333333, 12.5180555556), + ("EDMV", 48.6363888889, 13.1952777778), + ("EDNL", 47.8588888889, 10.0144444444), + ("EDNY", 47.6711111111, 9.51138888889), + ("EDOP", 53.4269444444, 11.7833333333), + ("EDOV", 52.6288888889, 11.8197222222), + ("EDPA", 48.7777777778, 10.2644444444), + ("EDQC", 50.2625, 10.9958333333), + ("EDQD", 49.9841666667, 11.6383333333), + ("EDQE", 49.7941666667, 11.1322222222), + ("EDQM", 50.2886111111, 11.8547222222), + ("EDQP", 49.8627777778, 11.7877777778), + ("EDQT", 50.0177777778, 10.5294444444), + ("EDRK", 50.3247222222, 7.53083333333), + ("EDRT", 49.8633333333, 6.78888888889), + ("EDRY", 49.3025, 8.45111111111), + ("EDRZ", 49.2094444444, 7.40055555556), + ("EDTB", 48.7911111111, 8.18694444444), + ("EDTD", 47.9730555556, 8.52222222222), + ("EDTF", 48.0202777778, 7.83361111111), + ("EDTK", 48.9822222222, 8.33333333333), + ("EDTM", 48.0536111111, 9.37277777778), + ("EDTY", 49.1180555556, 9.77722222222), + ("EDUS", 51.6075, 13.7377777778), + ("EDVE", 52.3191666667, 10.5561111111), + ("EDVK", 51.4083333333, 9.3775), + ("EDVM", 52.1775, 9.94555555556), + ("EDWB", 53.5033333333, 8.57333333333), + ("EDWD", 53.1430555556, 8.62333333333), + ("EDWE", 53.3911111111, 7.22722222222), + ("EDWF", 53.2719444444, 7.44277777778), + ("EDWI", 53.5047222222, 8.05333333333), + ("EDWR", 53.5952777778, 6.70916666667), + ("EDWY", 53.7066666667, 7.23), + ("EDXF", 54.7716666667, 9.37805555556), + ("EDXR", 54.2208333333, 9.60055555556), + ("EDXW", 54.9130555556, 8.34027777778), + ("EEEI", 59.2594444444, 24.2044444444), + ("EEKA", 58.9905555556, 22.8305555556), + ("EEKE", 58.2297222222, 22.5094444444), + ("EEPU", 58.4188888889, 24.4727777778), + ("EETN", 59.4130555556, 24.8327777778), + ("EETU", 58.3072222222, 26.6902777778), + ("EFET", 68.3625, 23.4241666667), + ("EFEU", 61.1161111111, 22.2013888889), + ("EFHA", 61.8558333333, 24.7863888889), + ("EFHF", 60.2544444444, 25.0427777778), + ("EFHK", 60.32, 24.9561111111), + ("EFHM", 61.6894444444, 23.0736111111), + ("EFHN", 59.8486111111, 23.0833333333), + ("EFHV", 60.6544444444, 24.8811111111), + ("EFIK", 60.4625, 23.6525), + ("EFIM", 61.2491666667, 28.9036111111), + ("EFIT", 62.1661111111, 30.0736111111), + ("EFIV", 68.6072222222, 27.4052777778), + ("EFJO", 62.6588888889, 29.6244444444), + ("EFJY", 62.3994444444, 25.6780555556), + ("EFKA", 63.1269444444, 23.0513888889), + ("EFKE", 65.7816666667, 24.5988888889), + ("EFKI", 64.2852777778, 27.6922222222), + ("EFKJ", 62.4625, 22.3930555556), + ("EFKK", 63.7211111111, 23.1430555556), + ("EFKM", 66.7127777778, 27.1566666667), + ("EFKS", 65.9875, 29.2391666667), + ("EFKT", 67.7008333333, 24.8466666667), + ("EFKU", 63.0069444444, 27.7975), + ("EFLA", 61.1438888889, 25.6933333333), + ("EFLP", 61.0444444444, 28.1441666667), + ("EFMA", 60.1219444444, 19.8980555556), + ("EFME", 62.9466666667, 23.5188888889), + ("EFMI", 61.6863888889, 27.2016666667), + ("EFNU", 60.3338888889, 24.2963888889), + ("EFOU", 64.93, 25.3544444444), + ("EFPI", 61.2455555556, 22.1933333333), + ("EFPO", 61.4616666667, 21.7997222222), + ("EFPU", 65.4022222222, 26.9469444444), + ("EFPY", 63.7316666667, 25.9261111111), + ("EFRH", 64.6880555556, 24.6958333333), + ("EFRN", 62.0652777778, 28.3563888889), + ("EFRO", 66.5647222222, 25.8302777778), + ("EFRY", 60.7447222222, 24.1077777778), + ("EFSA", 61.9430555556, 28.945), + ("EFSE", 61.0622222222, 26.7986111111), + ("EFSO", 67.395, 26.6188888889), + ("EFTP", 61.4138888889, 23.6041666667), + ("EFTS", 61.7733333333, 24.0269444444), + ("EFTU", 60.5138888889, 22.2627777778), + ("EFUT", 60.8963888889, 26.9383333333), + ("EFVA", 63.0511111111, 21.7613888889), + ("EFVR", 62.1711111111, 27.8686111111), + ("EFYL", 64.0602777778, 24.7158333333), + ("EGAA", 54.6575, -6.21583333333), + ("EGAB", 54.3988888889, -7.65166666667), + ("EGAC", 54.6180555556, -5.8725), + ("EGAE", 55.0427777778, -7.16111111111), + ("EGBB", 52.4536111111, -1.74777777778), + ("EGBE", 52.3697222222, -1.47972222222), + ("EGBG", 52.6077777778, -1.03194444444), + ("EGBJ", 51.8941666667, -2.16722222222), + ("EGBN", 52.92, -1.07916666667), + ("EGBO", 52.5175, -2.25972222222), + ("EGBP", 51.6680555556, -2.05694444444), + ("EGBT", 52.0408333333, -1.09555555556), + ("EGCC", 53.3536111111, -2.27472222222), + ("EGCD", 53.3380555556, -2.14888888889), + ("EGCF", 53.5597222222, -0.858333333333), + ("EGDC", 51.0869444444, -4.15027777778), + ("EGDG", 50.4405555556, -4.99527777778), + ("EGDL", 51.505, -1.99333333333), + ("EGDM", 51.1519444444, -1.74722222222), + ("EGDR", 50.0858333333, -5.25555555556), + ("EGDX", 51.4047222222, -3.43555555556), + ("EGDY", 51.0091666667, -2.63861111111), + ("EGFE", 51.8330555556, -4.96111111111), + ("EGFF", 51.3966666667, -3.34333333333), + ("EGFH", 51.6052777778, -4.06777777778), + ("EGGD", 51.3825, -2.71888888889), + ("EGGP", 53.3336111111, -2.84972222222), + ("EGGW", 51.8744444444, -0.368333333333), + ("EGHD", 50.4227777778, -4.10583333333), + ("EGHH", 50.78, -1.8425), + ("EGHI", 50.95, -1.35666666667), + ("EGHL", 51.185, -1.03222222222), + ("EGJB", 49.4347222222, -2.60194444444), + ("EGJJ", 49.2077777778, -2.19527777778), + ("EGKA", 50.8355555556, -0.297222222222), + ("EGKB", 51.3308333333, 0.0325), + ("EGKK", 51.1480555556, -0.190277777778), + ("EGLC", 51.505, 0.0541666666667), + ("EGLF", 51.2758333333, -0.776111111111), + ("EGLJ", 51.6761111111, -1.08083333333), + ("EGLK", 51.3238888889, -0.8475), + ("EGLL", 51.4775, -0.461388888889), + ("EGMC", 51.5713888889, 0.695555555556), + ("EGMD", 50.9561111111, 0.939166666667), + ("EGMH", 51.3422222222, 1.34611111111), + ("EGNB", 53.7194444444, -0.566111111111), + ("EGNC", 54.9375, -2.80916666667), + ("EGNH", 53.7716666667, -3.02861111111), + ("EGNJ", 53.5744444444, -0.350833333333), + ("EGNL", 54.1297222222, -3.25611111111), + ("EGNM", 53.8658333333, -1.66055555556), + ("EGNO", 53.745, -2.88305555556), + ("EGNR", 53.1780555556, -2.97777777778), + ("EGNS", 54.0833333333, -4.62388888889), + ("EGNT", 55.0375, -1.69166666667), + ("EGNV", 54.5091666667, -1.42916666667), + ("EGNX", 52.8311111111, -1.32805555556), + ("EGOD", 52.8116666667, -4.12333333333), + ("EGOE", 52.8711111111, -2.53333333333), + ("EGOQ", 53.2583333333, -4.37333333333), + ("EGOS", 52.7980555556, -2.66777777778), + ("EGOV", 53.2480555556, -4.53527777778), + ("EGOW", 53.5813888889, -3.05527777778), + ("EGOY", 54.8511111111, -4.94777777778), + ("EGPA", 58.9580555556, -2.905), + ("EGPB", 59.8788888889, -1.29555555556), + ("EGPC", 58.4586111111, -3.09277777778), + ("EGPD", 57.2041666667, -2.20027777778), + ("EGPE", 57.54, -4.05), + ("EGPF", 55.8719444444, -4.43305555556), + ("EGPH", 55.95, -3.3725), + ("EGPI", 55.6819444444, -6.25666666667), + ("EGPK", 55.5077777778, -4.58666666667), + ("EGPL", 57.4811111111, -7.36277777778), + ("EGPM", 60.4322222222, -1.29805555556), + ("EGPN", 56.4525, -3.02583333333), + ("EGPO", 58.2136111111, -6.32888888889), + ("EGPU", 56.4991666667, -6.86916666667), + ("EGQL", 56.3727777778, -2.86833333333), + ("EGQS", 57.705, -3.33916666667), + ("EGRR", 51.3833333333, -0.783333333333), + ("EGSC", 52.205, 0.175), + ("EGSF", 52.4680555556, -0.251111111111), + ("EGSH", 52.6758333333, 1.28277777778), + ("EGSS", 51.885, 0.235), + ("EGSX", 51.7216666667, 0.154166666667), + ("EGSY", 53.3941666667, -1.38833333333), + ("EGTC", 52.0722222222, -0.616666666667), + ("EGTD", 51.1166666667, -0.534444444444), + ("EGTE", 50.7344444444, -3.41388888889), + ("EGTG", 51.5194444444, -2.59083333333), + ("EGTH", 51.7666666667, 0.25), + ("EGTK", 51.8369444444, -1.32), + ("EGUB", 51.6161111111, -1.09555555556), + ("EGUL", 52.4091666667, 0.560833333333), + ("EGUN", 52.3608333333, 0.488333333333), + ("EGUW", 52.1272222222, 0.955833333333), + ("EGUY", 52.3572222222, -0.107777777778), + ("EGVA", 51.6819444444, -1.79), + ("EGVN", 51.7497222222, -1.58361111111), + ("EGVO", 51.2341666667, -0.942777777778), + ("EGWC", 52.64, -2.30555555556), + ("EGWU", 51.5527777778, -0.418055555556), + ("EGXC", 53.0927777778, -0.165833333333), + ("EGXD", 54.1369444444, -1.42), + ("EGXE", 54.2922222222, -1.535), + ("EGXG", 53.8341666667, -1.19527777778), + ("EGXH", 52.3425, 0.772777777778), + ("EGXJ", 52.7355555556, -0.648611111111), + ("EGXP", 53.3075, -0.550833333333), + ("EGXT", 52.6125, -0.476388888889), + ("EGXU", 54.0494444444, -1.25194444444), + ("EGXW", 53.1661111111, -0.523611111111), + ("EGXZ", 54.2055555556, -1.38222222222), + ("EGYC", 52.7547222222, 1.35722222222), + ("EGYD", 53.0305555556, -0.481111111111), + ("EGYE", 52.9622222222, -0.561388888889), + ("EGYM", 52.6483333333, 0.550277777778), + ("EGYP", -51.8227777778, -58.4472222222), + ("EHAM", 52.3086111111, 4.76388888889), + ("EHBD", 51.2552777778, 5.60138888889), + ("EHBK", 50.9113888889, 5.77), + ("EHDL", 52.0605555556, 5.87305555556), + ("EHDR", 53.1191666667, 6.12972222222), + ("EHEH", 51.45, 5.37444444444), + ("EHGG", 53.1194444444, 6.57944444444), + ("EHGR", 51.5677777778, 4.93305555556), + ("EHKD", 52.9233333333, 4.78055555556), + ("EHLE", 52.4602777778, 5.52722222222), + ("EHLW", 53.2286111111, 5.76055555556), + ("EHRD", 51.9572222222, 4.44166666667), + ("EHSB", 52.1269444444, 5.27638888889), + ("EHTW", 52.27, 6.87416666667), + ("EHVB", 52.1697222222, 4.42611111111), + ("EHWO", 51.4488888889, 4.34194444444), + ("EICK", 51.8427777778, -8.49194444444), + ("EICM", 53.3013888889, -8.93916666667), + ("EIDL", 55.0441666667, -8.34083333333), + ("EIDW", 53.4211111111, -6.27), + ("EIKN", 53.9102777778, -8.81833333333), + ("EIKY", 52.1808333333, -9.52361111111), + ("EIME", 53.3027777778, -6.44277777778), + ("EINN", 52.7019444444, -8.92472222222), + ("EISG", 54.28, -8.59916666667), + ("EIWF", 52.1869444444, -7.08694444444), + ("EKAH", 56.3041666667, 10.6194444444), + ("EKBI", 55.7402777778, 9.15166666667), + ("EKCH", 55.6177777778, 12.6558333333), + ("EKEB", 55.5258333333, 8.55333333333), + ("EKGH", 55.9411111111, 12.3822222222), + ("EKHO", 56.3966666667, 8.44333333333), + ("EKKA", 56.2972222222, 9.12444444444), + ("EKLS", 57.2777777778, 11.0013888889), + ("EKMB", 54.6991666667, 11.44), + ("EKOD", 55.4761111111, 10.3291666667), + ("EKPB", 54.8702777778, 9.27916666667), + ("EKRK", 55.5855555556, 12.1313888889), + ("EKRN", 55.0630555556, 14.7594444444), + ("EKSB", 54.9641666667, 9.79166666667), + ("EKSN", 57.5033333333, 10.2291666667), + ("EKSP", 55.2252777778, 9.26388888889), + ("EKSV", 56.55, 9.17277777778), + ("EKTS", 57.0686111111, 8.705), + ("EKVA", 55.6969444444, 9.19333333333), + ("EKVD", 55.4361111111, 9.33083333333), + ("EKVG", 62.0636111111, -7.27694444444), + ("EKVH", 56.8469444444, 9.45861111111), + ("EKVJ", 55.99, 8.35388888889), + ("EKVL", 55.7672222222, 12.3433333333), + ("EKYT", 57.0927777778, 9.84888888889), + ("ELLX", 49.6263888889, 6.21138888889), + ("ENAL", 62.5602777778, 6.11), + ("ENAN", 69.2925, 16.1441666667), + ("ENAT", 69.9769444444, 23.3661111111), + ("ENBL", 61.3925, 5.76416666667), + ("ENBM", 60.6386111111, 6.50138888889), + ("ENBN", 65.4591666667, 12.2136111111), + ("ENBO", 67.2688888889, 14.3633333333), + ("ENBR", 60.2933333333, 5.21805555556), + ("ENBS", 70.6, 29.6925), + ("ENCN", 58.2041666667, 8.08527777778), + ("ENDI", 60.4166666667, 8.51388888889), + ("ENDU", 69.0555555556, 18.5402777778), + ("ENEV", 68.4911111111, 16.6780555556), + ("ENFB", 59.8955555556, 10.6169444444), + ("ENFG", 61.0111111111, 9.29305555556), + ("ENFL", 61.5838888889, 5.025), + ("ENGM", 60.1938888889, 11.1002777778), + ("ENHA", 60.8183333333, 11.0672222222), + ("ENHD", 59.345, 5.20833333333), + ("ENHK", 70.4866666667, 22.1397222222), + ("ENKB", 63.1116666667, 7.82444444444), + ("ENKJ", 59.9691666667, 11.0358333333), + ("ENKR", 69.725, 29.8875), + ("ENLI", 58.1002777778, 6.625), + ("ENML", 62.7461111111, 7.2725), + ("ENMS", 65.7838888889, 13.2147222222), + ("ENNA", 70.0686111111, 24.9733333333), + ("ENNO", 59.5655555556, 9.21166666667), + ("ENOL", 63.6988888889, 9.60388888889), + ("ENRO", 62.5783333333, 11.3422222222), + ("ENRY", 59.3788888889, 10.7855555556), + ("ENSB", 78.2461111111, 15.4655555556), + ("ENSG", 61.1561111111, 7.13638888889), + ("ENSN", 59.185, 9.56694444444), + ("ENSO", 59.7916666667, 5.34083333333), + ("ENSR", 69.7869444444, 20.9594444444), + ("ENSS", 70.3552777778, 31.0447222222), + ("ENST", 65.9566666667, 12.4688888889), + ("ENTC", 69.6833333333, 18.9188888889), + ("ENTO", 59.1866666667, 10.2586111111), + ("ENVA", 63.4575, 10.9397222222), + ("ENZV", 58.8766666667, 5.63777777778), + ("EPGD", 54.3775, 18.4661111111), + ("EPKK", 50.0775, 19.7847222222), + ("EPKM", 50.2383333333, 19.035), + ("EPKO", 54.0422222222, 16.2636111111), + ("EPKT", 50.4741666667, 19.08), + ("EPLL", 51.7219444444, 19.3980555556), + ("EPML", 50.3222222222, 21.4619444444), + ("EPPO", 52.4211111111, 16.8263888889), + ("EPRZ", 50.11, 22.0188888889), + ("EPSC", 53.5847222222, 14.9019444444), + ("EPSD", 53.3919444444, 14.6336111111), + ("EPSK", 54.4788888889, 17.1075), + ("EPSN", 53.7905555556, 15.8280555556), + ("EPWA", 52.1655555556, 20.9669444444), + ("EPWR", 51.1025, 16.8858333333), + ("EPZG", 52.1386111111, 15.7986111111), + ("ESCF", 58.4022222222, 15.5255555556), + ("ESCK", 58.6108333333, 16.1033333333), + ("ESCM", 59.8972222222, 17.5883333333), + ("ESCN", 59.1808333333, 17.9122222222), + ("ESDB", 56.2958333333, 12.8469444444), + ("ESDF", 56.2666666667, 15.265), + ("ESFH", 58.4091666667, 13.2625), + ("ESFI", 56.1836111111, 14.1322222222), + ("ESFM", 58.5980555556, 14.1136111111), + ("ESFQ", 56.8441666667, 15.4525), + ("ESFR", 58.4980555556, 13.0530555556), + ("ESFY", 56.785, 13.6016666667), + ("ESGG", 57.6627777778, 12.2797222222), + ("ESGJ", 57.7575, 14.0686111111), + ("ESGK", 58.1697222222, 13.5877777778), + ("ESGL", 58.4652777778, 13.1741666667), + ("ESGP", 57.7747222222, 11.8702777778), + ("ESGR", 58.4563888889, 13.9725), + ("ESGT", 58.3180555556, 12.345), + ("ESIA", 58.5136111111, 14.5069444444), + ("ESIB", 58.4263888889, 12.7141666667), + ("ESKA", 60.1327777778, 18.105), + ("ESKB", 59.4186111111, 17.8905555556), + ("ESKK", 59.3458333333, 14.4958333333), + ("ESKM", 60.9577777778, 14.5111111111), + ("ESKN", 58.7886111111, 16.9119444444), + ("ESKS", 59.3138888889, 17.1091666667), + ("ESKV", 59.6758333333, 12.6391666667), + ("ESKX", 58.7908333333, 16.5708333333), + ("ESMA", 56.6105555556, 15.6047222222), + ("ESMG", 56.9502777778, 13.9216666667), + ("ESMK", 55.9216666667, 14.0852777778), + ("ESML", 55.9447222222, 12.8608333333), + ("ESMO", 57.3502777778, 16.4977777778), + ("ESMP", 57.2641666667, 13.5991666667), + ("ESMQ", 56.6852777778, 16.2875), + ("ESMS", 55.53, 13.3713888889), + ("ESMT", 56.6911111111, 12.82), + ("ESMV", 57.2922222222, 14.1372222222), + ("ESMX", 56.9288888889, 14.7277777778), + ("ESNA", 63.7383333333, 15.4583333333), + ("ESNC", 62.4088888889, 13.7472222222), + ("ESND", 62.0477777778, 14.4227777778), + ("ESNF", 61.8980555556, 15.7052777778), + ("ESNG", 67.1322222222, 20.8144444444), + ("ESNH", 61.7680555556, 17.0805555556), + ("ESNI", 63.6336111111, 17.9397222222), + ("ESNJ", 66.4961111111, 20.1469444444), + ("ESNK", 63.0483333333, 17.7686111111), + ("ESNL", 64.5480555556, 18.7161111111), + ("ESNM", 63.1286111111, 14.8027777778), + ("ESNN", 62.5280555556, 17.4438888889), + ("ESNO", 63.4083333333, 18.99), + ("ESNP", 65.3994444444, 21.2652777778), + ("ESNQ", 67.8219444444, 20.3366666667), + ("ESNR", 61.19, 14.7125), + ("ESNS", 64.6247222222, 21.0766666667), + ("ESNT", 62.4811111111, 17.0027777778), + ("ESNU", 63.7916666667, 20.2825), + ("ESNV", 64.5788888889, 16.8333333333), + ("ESNX", 65.59, 19.2816666667), + ("ESOE", 59.2236111111, 15.0377777778), + ("ESOH", 60.02, 13.5788888889), + ("ESOW", 59.5894444444, 16.6336111111), + ("ESPA", 65.5436111111, 22.1219444444), + ("ESPC", 63.1938888889, 14.5019444444), + ("ESPE", 65.8752777778, 20.1497222222), + ("ESPJ", 65.8361111111, 21.4713888889), + ("ESQO", 59.3863888889, 15.9238888889), + ("ESSA", 59.6519444444, 17.9186111111), + ("ESSB", 59.3541666667, 17.9413888889), + ("ESSD", 60.4219444444, 15.515), + ("ESSF", 57.5255555556, 15.8238888889), + ("ESSK", 60.5933333333, 16.9513888889), + ("ESSL", 58.4061111111, 15.6802777778), + ("ESSP", 58.5861111111, 16.2505555556), + ("ESST", 60.1575, 12.9911111111), + ("ESSU", 59.3508333333, 16.7083333333), + ("ESSV", 57.6627777778, 18.3461111111), + ("ESUA", 64.5705555556, 19.3141666667), + ("ESUD", 64.9608333333, 17.6963888889), + ("ESUE", 61.8686111111, 12.6905555556), + ("ESUF", 65.1063888889, 20.7605555556), + ("ESUK", 67.7647222222, 20.2572222222), + ("ESUT", 65.8061111111, 15.0827777778), + ("ETAD", 49.9725, 6.6925), + ("ETAR", 49.4375, 7.60138888889), + ("ETEJ", 49.9202777778, 10.9141666667), + ("ETEK", 49.65, 7.3), + ("ETEU", 49.6480555556, 9.96638888889), + ("ETHB", 52.2783333333, 9.08194444444), + ("ETHC", 52.5911111111, 10.0219444444), + ("ETHE", 52.2911111111, 7.38694444444), + ("ETHF", 51.1144444444, 9.28583333333), + ("ETHI", 53.9944444444, 9.57833333333), + ("ETHL", 48.2202777778, 9.91), + ("ETHM", 50.3658333333, 7.315), + ("ETHN", 49.3916666667, 9.95805555556), + ("ETHR", 49.2175, 11.1005555556), + ("ETHS", 52.9191666667, 10.1836111111), + ("ETHT", 51.7677777778, 14.2919444444), + ("ETIC", 49.6994444444, 11.9411111111), + ("ETID", 50.1691666667, 8.96138888889), + ("ETIE", 49.3933333333, 8.65194444444), + ("ETIH", 49.2180555556, 11.8361111111), + ("ETIN", 49.7430555556, 10.2005555556), + ("ETME", 54.6247222222, 9.34138888889), + ("ETMN", 53.7675, 8.65833333333), + ("ETND", 52.5852777778, 8.34055555556), + ("ETNG", 50.9608333333, 6.0425), + ("ETNH", 54.3119444444, 9.53805555556), + ("ETNJ", 53.5333333333, 7.88861111111), + ("ETNL", 53.9180555556, 12.2791666667), + ("ETNN", 50.8311111111, 6.65805555556), + ("ETNP", 52.3386111111, 7.54111111111), + ("ETNR", 51.6636111111, 14.6336111111), + ("ETNS", 54.4591666667, 9.51611111111), + ("ETNT", 53.5477777778, 7.66722222222), + ("ETNU", 53.6019444444, 13.3058333333), + ("ETNW", 52.4572222222, 9.42694444444), + ("ETOI", 49.6336111111, 11.7672222222), + ("ETOR", 49.5633333333, 8.46333333333), + ("ETOU", 50.0497222222, 8.32527777778), + ("ETSA", 48.0705555556, 10.9058333333), + ("ETSB", 50.1736111111, 7.06333333333), + ("ETSE", 48.3222222222, 11.9486111111), + ("ETSF", 48.2055555556, 11.2669444444), + ("ETSH", 51.7677777778, 13.1675), + ("ETSI", 48.7155555556, 11.5338888889), + ("ETSL", 48.1861111111, 10.8622222222), + ("ETSM", 47.9886111111, 10.2394444444), + ("ETSN", 48.7108333333, 11.2111111111), + ("ETUL", 51.6016666667, 6.1425), + ("ETUO", 51.9227777778, 8.30611111111), + ("ETUR", 51.1997222222, 6.13194444444), + ("FAAB", -28.575, 16.5333333333), + ("FAAG", -29.2816666667, 18.8136111111), + ("FAAP", -25.9436111111, 29.81), + ("FABB", -26.2386111111, 28.3016666667), + ("FABE", -32.8969444444, 27.2788888889), + ("FABL", -29.0925, 26.3022222222), + ("FABM", -28.2483333333, 28.3361111111), + ("FABO", -27.3666666667, 26.6291666667), + ("FACR", -26.3694444444, 27.35), + ("FACT", -33.9647222222, 18.6016666667), + ("FACV", -31.5002777778, 19.7258333333), + ("FADA", -30.6366666667, 23.92), + ("FADB", -24.805, 26.8316666667), + ("FADD", -28.1825, 30.2244444444), + ("FADN", -29.97, 30.9502777778), + ("FAEL", -33.0355555556, 27.8258333333), + ("FAEO", -26.4952777778, 29.98), + ("FAER", -23.7261111111, 27.6875), + ("FAFB", -28.8230555556, 27.9088888889), + ("FAGC", -25.9861111111, 28.14), + ("FAGG", -34.0052777778, 22.3788888889), + ("FAGI", -23.2836111111, 30.6497222222), + ("FAGM", -26.2425, 28.1511111111), + ("FAGT", -33.2847222222, 26.4980555556), + ("FAGY", -29.1219444444, 30.5866666667), + ("FAHA", -28.0786111111, 26.8611111111), + ("FAHE", -25.9794444444, 29.6186111111), + ("FAHG", -26.5061111111, 28.3938888889), + ("FAHO", -27.2783333333, 27.9958333333), + ("FAHR", -28.235, 29.1061111111), + ("FAHS", -24.3686111111, 31.0486111111), + ("FAHV", -30.5619444444, 25.5280555556), + ("FAJS", -26.1391666667, 28.2458333333), + ("FAKD", -26.8708333333, 26.7177777778), + ("FAKG", -26.0933333333, 29.4547222222), + ("FAKL", -26.2516666667, 29.1944444444), + ("FAKM", -28.8027777778, 24.765), + ("FAKP", -25.4405555556, 31.9297222222), + ("FAKR", -26.0808333333, 27.7255555556), + ("FAKS", -27.6605555556, 27.3155555556), + ("FAKU", -27.4566666667, 23.4113888889), + ("FAKZ", -29.6883333333, 17.0938888889), + ("FALA", -25.9383333333, 27.9261111111), + ("FALB", -29.1811111111, 27.4530555556), + ("FALI", -26.1755555556, 26.1844444444), + ("FALT", -23.1597222222, 29.6963888889), + ("FALW", -32.9688888889, 18.1602777778), + ("FALY", -28.5816666667, 29.7497222222), + ("FAMB", -25.6847222222, 29.44), + ("FAMG", -30.8572222222, 30.3427777778), + ("FAMI", -24.9888888889, 29.2830555556), + ("FAMJ", -27.0791666667, 29.7783333333), + ("FAMK", -25.7527777778, 25.6119444444), + ("FAMM", -25.7983333333, 25.5477777778), + ("FAMN", -25.4733333333, 31.5655555556), + ("FAMS", -22.3558333333, 29.9863888889), + ("FAMU", -27.6258333333, 32.0441666667), + ("FANC", -27.7705555556, 29.9766666667), + ("FANS", -25.5005555556, 30.9133333333), + ("FANY", -24.6858333333, 28.4347222222), + ("FAOB", -34.5552777778, 20.2502777778), + ("FAOH", -33.6069444444, 22.1888888889), + ("FAPB", -23.8452777778, 29.4586111111), + ("FAPE", -33.9847222222, 25.6172222222), + ("FAPG", -34.0902777778, 23.3277777778), + ("FAPH", -23.9369444444, 31.1552777778), + ("FAPI", -23.9258333333, 29.4841666667), + ("FAPJ", -31.6058333333, 29.5197222222), + ("FAPM", -29.6488888889, 30.3986111111), + ("FAPN", -25.3336111111, 27.1733333333), + ("FAPP", -24.2302777778, 28.9836111111), + ("FAPQ", -25.8469444444, 23.5377777778), + ("FAPS", -26.6708333333, 27.0816666667), + ("FAPY", -26.8891666667, 27.5033333333), + ("FAQT", -31.92, 26.8819444444), + ("FARB", -28.7408333333, 32.0919444444), + ("FARG", -25.6441666667, 27.2711111111), + ("FARS", -33.8119444444, 19.9027777778), + ("FASB", -29.6891666667, 17.9394444444), + ("FASC", -26.5238888889, 29.17), + ("FASD", -32.9638888889, 17.9691666667), + ("FASI", -26.2483333333, 28.3975), + ("FASK", -25.8094444444, 28.1644444444), + ("FASS", -27.6483333333, 22.9991666667), + ("FASU", -25.9613888889, 29.2086111111), + ("FASZ", -24.9608333333, 31.5886111111), + ("FATF", -28.26, 22.9930555556), + ("FATH", -23.0786111111, 30.3833333333), + ("FATN", -29.3191666667, 26.8233333333), + ("FATP", -29.0327777778, 26.1575), + ("FATT", -26.7763888889, 29.3386111111), + ("FATZ", -23.8241666667, 30.3291666667), + ("FAUL", -28.3205555556, 31.4163888889), + ("FAUP", -28.4008333333, 21.2605555556), + ("FAUT", -31.5477777778, 28.6741666667), + ("FAVB", -26.9822222222, 24.7286111111), + ("FAVG", -29.7705555556, 31.0583333333), + ("FAVP", -26.6922222222, 27.7777777778), + ("FAVR", -31.6408333333, 18.5447222222), + ("FAVV", -26.5661111111, 27.9605555556), + ("FAVY", -27.7866666667, 30.7952777778), + ("FAWB", -25.6536111111, 28.2241666667), + ("FAWI", -25.8322222222, 29.1919444444), + ("FAWK", -25.83, 28.2225), + ("FAWM", -27.9977777778, 26.6694444444), + ("FAWS", -27.8472222222, 26.3497222222), + ("FAYP", -33.9, 18.4980555556), + ("FAZR", -25.5988888889, 26.0422222222), + ("FBFT", -21.1594444444, 27.4744444444), + ("FBJW", -24.6022222222, 24.6908333333), + ("FBKE", -17.8327777778, 25.1622222222), + ("FBMN", -19.9725, 23.4308333333), + ("FBOR", -21.2663888889, 25.3202777778), + ("FBSK", -24.555, 25.9180555556), + ("FBSP", -22.0583333333, 27.8286111111), + ("FCBB", -4.25166666667, 15.2527777778), + ("FCOI", 1.58944444444, 18.0469444444), + ("FCOM", -0.0213888888889, 15.5752777778), + ("FCOO", -0.531111111111, 15.95), + ("FCOU", 1.61583333333, 16.0377777778), + ("FCPA", -3.48333333333, 12.6166666667), + ("FCPD", -4.20777777778, 12.6608333333), + ("FCPP", -4.81333333333, 11.8858333333), + ("FDMS", -26.5288888889, 31.3075), + ("FEFF", 4.39833333333, 18.5186111111), + ("FEFG", 4.78444444444, 22.7813888889), + ("FEFI", 10.2361111111, 22.7172222222), + ("FEFM", 5.84694444444, 20.6494444444), + ("FEFN", 8.42666666667, 20.635), + ("FEFO", 5.95805555556, 15.6375), + ("FEFR", 6.52805555556, 21.9888888889), + ("FEFT", 4.22138888889, 15.7861111111), + ("FEFY", 45.1541666667, -89.1108333333), + ("FGBT", 1.90527777778, 9.80555555556), + ("FGSL", 3.75527777778, 8.70861111111), + ("FHAW", -7.96944444444, -14.3936111111), + ("FIMP", -20.43, 57.6833333333), + ("FIMR", -19.7577777778, 63.3619444444), + ("FJDG", -7.31305555556, 72.4108333333), + ("FKKC", 4.08916666667, 9.36027777778), + ("FKKD", 4.00583333333, 9.71944444444), + ("FKKI", 4.47305555556, 14.3636111111), + ("FKKL", 10.4513888889, 14.2572222222), + ("FKKM", 5.63666666667, 10.7505555556), + ("FKKN", 7.35694444444, 13.5591666667), + ("FKKR", 9.33583333333, 13.37), + ("FKKU", 5.53694444444, 10.3541666667), + ("FKKV", 6.03916666667, 10.1225), + ("FKKY", 3.83527777778, 11.5236111111), + ("FLKE", -12.5727777778, 27.8938888889), + ("FLKL", -14.9975, 22.6475), + ("FLLI", -17.8216666667, 25.8225), + ("FLLS", -15.3305555556, 28.4525), + ("FLMA", -11.1380555556, 28.875), + ("FLMF", -13.2586111111, 31.9363888889), + ("FLMG", -15.2544444444, 23.1622222222), + ("FLML", -12.5647222222, 28.2986111111), + ("FLND", -12.9980555556, 28.6647222222), + ("FLSO", -12.9002777778, 28.1497222222), + ("FLZB", -13.5386111111, 23.1097222222), + ("FMCH", -11.5336111111, 43.2716666667), + ("FMCI", -12.2980555556, 43.7663888889), + ("FMCN", -11.7105555556, 43.2436111111), + ("FMCV", -12.1316666667, 44.4302777778), + ("FMCZ", -12.8047222222, 45.2811111111), + ("FMEE", -20.8869444444, 55.5102777778), + ("FMEP", -21.3208333333, 55.4247222222), + ("FMMI", -18.7966666667, 47.4786111111), + ("FMMN", -19.5627777778, 45.4508333333), + ("FMMS", -17.0938888889, 49.8158333333), + ("FMMT", -18.1094444444, 49.3925), + ("FMMV", -20.2847222222, 44.3175), + ("FMNA", -12.3491666667, 49.2916666667), + ("FMNC", -16.1638888889, 49.7736111111), + ("FMND", -14.6516666667, 49.6205555556), + ("FMNE", -13.1883333333, 48.9877777778), + ("FMNH", -14.9991666667, 50.32), + ("FMNL", -14.6294444444, 47.7636111111), + ("FMNM", -15.6672222222, 46.3516666667), + ("FMNN", -13.3122222222, 48.3138888889), + ("FMNQ", -16.7419444444, 44.4813888889), + ("FMNR", -15.4366666667, 49.6883333333), + ("FMNS", -14.2786111111, 50.1747222222), + ("FMNV", -13.3758333333, 50.0027777778), + ("FMNW", -14.8986111111, 47.9938888889), + ("FMNZ", -13.4847222222, 48.6325), + ("FMSD", -25.0380555556, 46.9561111111), + ("FMSF", -21.4413888889, 47.1116666667), + ("FMSG", -22.8052777778, 47.8205555556), + ("FMSK", -22.1197222222, 48.0216666667), + ("FMSM", -21.2016666667, 48.3580555556), + ("FMSR", -21.7536111111, 43.3752777778), + ("FMST", -23.3833333333, 43.7283333333), + ("FNBC", -6.26972222222, 14.2469444444), + ("FNBG", -12.6088888889, 13.4036111111), + ("FNCA", -5.59694444444, 12.1883333333), + ("FNCH", -7.3575, 20.8036111111), + ("FNCX", -8.37361111111, 18.9236111111), + ("FNCZ", -11.8936111111, 22.9161111111), + ("FNGI", -17.0447222222, 15.6869444444), + ("FNHU", -12.8086111111, 15.7602777778), + ("FNKU", -12.4044444444, 16.9472222222), + ("FNLB", -12.3711111111, 13.5363888889), + ("FNLU", -8.85833333333, 13.2311111111), + ("FNMA", -9.525, 16.3122222222), + ("FNME", -14.6575, 17.7197222222), + ("FNMO", -15.2611111111, 12.1466666667), + ("FNNG", -7.75444444444, 15.2875), + ("FNPA", -10.7219444444, 13.7652777778), + ("FNSA", -9.68888888889, 20.4316666667), + ("FNSO", -6.14083333333, 12.3716666667), + ("FNTO", -7.14722222222, 14.2480555556), + ("FNUE", -11.7680555556, 19.8975), + ("FNUG", -7.60305555556, 15.0277777778), + ("FNXA", -16.7552777778, 14.9652777778), + ("FOGO", 1.54111111111, 11.5808333333), + ("FOGQ", -0.665277777778, 13.6730555556), + ("FOGR", -0.704166666667, 10.2455555556), + ("FOOB", 2.07555555556, 11.4930555556), + ("FOOD", -1.5375, 13.2691666667), + ("FOOG", -0.711666666667, 8.75416666667), + ("FOOH", -1.57472222222, 9.26277777778), + ("FOOK", 0.579166666667, 12.8908333333), + ("FOOL", 0.458333333333, 9.41222222222), + ("FOOM", 0.775555555556, 11.5525), + ("FOON", -1.65611111111, 13.4377777778), + ("FOOR", -0.826388888889, 12.7466666667), + ("FOOT", -2.88888888889, 10.9194444444), + ("FPPR", 1.66277777778, 7.41166666667), + ("FPST", 0.378055555556, 6.71194444444), + ("FQBR", -19.7963888889, 34.9075), + ("FQCB", -14.82, 36.5319444444), + ("FQCH", -19.1511111111, 33.4288888889), + ("FQES", -15.7341666667, 32.7566666667), + ("FQIN", -23.8763888889, 35.4083333333), + ("FQLC", -13.2738888889, 35.2661111111), + ("FQLU", -15.0330555556, 40.6716666667), + ("FQMA", -25.9208333333, 32.5725), + ("FQMD", -11.6727777778, 39.5630555556), + ("FQMP", -11.3616666667, 40.3547222222), + ("FQMR", -13.225, 37.5519444444), + ("FQNC", -14.4880555556, 40.7122222222), + ("FQNP", -15.1055555556, 39.2816666667), + ("FQPB", -12.9866666667, 40.5222222222), + ("FQQL", -17.8555555556, 36.8691666667), + ("FQSG", -15.6025, 32.7730555556), + ("FQTT", -16.1047222222, 33.64), + ("FQUG", -14.7044444444, 34.3522222222), + ("FQVL", -22.0183333333, 35.3130555556), + ("FSAL", -7.00472222222, 52.7261111111), + ("FSDR", -5.69583333333, 53.6544444444), + ("FSFA", -10.1094444444, 51.1761111111), + ("FSIA", -4.67416666667, 55.5216666667), + ("FSPP", -4.31916666667, 55.6913888889), + ("FSSC", -7.16416666667, 56.2638888889), + ("FTTA", 9.15111111111, 18.3794444444), + ("FTTC", 13.8469444444, 20.8441666667), + ("FTTD", 8.62027777778, 16.0683333333), + ("FTTJ", 12.1336111111, 15.0338888889), + ("FTTP", 9.37916666667, 14.9258333333), + ("FTTY", 17.9169444444, 19.1108333333), + ("FVBU", -20.0172222222, 28.6177777778), + ("FVCP", -17.7513888889, 30.9244444444), + ("FVCZ", -21.0080555556, 31.5783333333), + ("FVFA", -18.0961111111, 25.8391666667), + ("FVGR", -18.9775, 32.4505555556), + ("FVHA", -17.9316666667, 31.0927777778), + ("FVKB", -16.5197222222, 28.8847222222), + ("FVMT", -17.4316666667, 32.1844444444), + ("FVMU", -18.9975, 32.6272222222), + ("FVMV", -20.0552777778, 30.8588888889), + ("FVSH", -20.2894444444, 30.0883333333), + ("FVTL", -19.4366666667, 29.8616666667), + ("FVWN", -18.6297222222, 27.0208333333), + ("FVZC", -19.0286111111, 29.7219444444), + ("FWCL", -15.6788888889, 34.9738888889), + ("FWKA", -9.95333333333, 33.8927777778), + ("FWKG", -13.0144444444, 33.4683333333), + ("FWMG", 30.8377777778, -85.1816666667), + ("FWUU", -11.4447222222, 34.0116666667), + ("FXMM", -29.4622222222, 27.5525), + ("FXMU", -29.3038888889, 27.5033333333), + ("FZAA", -4.38555555556, 15.4444444444), + ("FZAB", -4.32472222222, 15.3283333333), + ("FZAG", -5.93083333333, 12.3516666667), + ("FZAI", -5.91805555556, 12.4475), + ("FZAM", -5.79944444444, 13.4408333333), + ("FZBO", -3.31111111111, 17.3816666667), + ("FZCA", -5.03555555556, 18.7855555556), + ("FZEA", 0.0225, 18.2886111111), + ("FZFD", 4.25305555556, 20.9752777778), + ("FZFK", 3.23527777778, 19.7711111111), + ("FZFP", 4.1575, 21.6508333333), + ("FZGA", 2.17055555556, 21.4966666667), + ("FZIA", 0.5175, 25.155), + ("FZJH", 2.8275, 27.5880555556), + ("FZKA", 1.56555555556, 30.2208333333), + ("FZKJ", 2.81777777778, 24.7938888889), + ("FZMA", -2.30888888889, 28.8086111111), + ("FZNA", -1.67055555556, 29.2383333333), + ("FZOA", -2.91916666667, 25.9152777778), + ("FZQA", -11.5911111111, 27.5308333333), + ("FZQM", -10.7658333333, 25.5055555556), + ("FZRF", -5.87555555556, 29.25), + ("FZSA", -8.64194444444, 25.2527777778), + ("FZTL", -9.46944444444, 25.7588888889), + ("FZUA", -5.9, 22.4691666667), + ("FZWA", -6.12111111111, 23.5688888889), + ("GABS", 12.5333333333, -7.94972222222), + ("GAGO", 16.2483333333, -0.00527777777778), + ("GAKY", 14.4311111111, -11.4394444444), + ("GAMB", 14.5127777778, -4.07944444444), + ("GANR", 15.2386111111, -9.57638888889), + ("GATB", 16.7302777778, -3.0075), + ("GATS", 20.2461111111, 0.980833333333), + ("GBYD", 13.3377777778, -16.6519444444), + ("GCFV", 28.4525, -13.8636111111), + ("GCHI", 27.8147222222, -17.8869444444), + ("GCLA", 28.6263888889, -17.7555555556), + ("GCLP", 27.9316666667, -15.3863888889), + ("GCRR", 28.9452777778, -13.605), + ("GCTS", 28.0444444444, -16.5722222222), + ("GCXO", 28.4825, -16.3413888889), + ("GEML", 35.2797222222, -2.95611111111), + ("GFHA", 8.39444444444, -13.1283333333), + ("GFLL", 8.61638888889, -13.1952777778), + ("GGCF", 11.2880555556, -15.1805555556), + ("GGOV", 11.8947222222, -15.6536111111), + ("GLMR", 6.28888888889, -10.7586111111), + ("GLRB", 6.23361111111, -10.3622222222), + ("GMAA", 30.3811111111, -9.54611111111), + ("GMAT", 28.4480555556, -11.1611111111), + ("GMFF", 33.9272222222, -4.97777777778), + ("GMFI", 33.5052777778, -5.15277777778), + ("GMFK", 31.9488888889, -4.40055555556), + ("GMFM", 33.8788888889, -5.515), + ("GMFN", 35.1533333333, -2.92), + ("GMFO", 34.7869444444, -1.92388888889), + ("GMMC", 33.5533333333, -7.66138888889), + ("GMME", 34.0513888889, -6.75138888889), + ("GMMF", 29.3688888889, -10.18), + ("GMMI", 31.4038888889, -9.68472222222), + ("GMMN", 33.3677777778, -7.58777777778), + ("GMMX", 31.6066666667, -8.03611111111), + ("GMMY", 34.2988888889, -6.59583333333), + ("GMMZ", 30.9388888889, -6.90916666667), + ("GMTA", 35.1769444444, -3.83944444444), + ("GMTN", 35.5941666667, -5.32), + ("GMTT", 35.7266666667, -5.91666666667), + ("GOGG", 12.5555555556, -16.2816666667), + ("GOGK", 12.88, -14.9552777778), + ("GOGS", 12.41, -16.7461111111), + ("GOOK", 14.1466666667, -16.0511111111), + ("GOOY", 14.7394444444, -17.49), + ("GOSS", 16.0497222222, -16.4611111111), + ("GOTB", 14.8472222222, -12.4680555556), + ("GOTK", 12.5722222222, -12.2202777778), + ("GOTT", 13.7366666667, -13.6530555556), + ("GQNA", 16.7111111111, -9.63777777778), + ("GQND", 18.5702777778, -11.4230555556), + ("GQNF", 16.5897222222, -11.4061111111), + ("GQNI", 16.6219444444, -7.31444444444), + ("GQNK", 16.1594444444, -13.5075), + ("GQNN", 18.0977777778, -15.9477777778), + ("GQNS", 15.1794444444, -12.2072222222), + ("GQPA", 20.5066666667, -13.0430555556), + ("GQPP", 20.9283333333, -17.0311111111), + ("GQPT", 25.2366666667, -11.5886111111), + ("GUFA", 10.3505555556, -13.5691666667), + ("GUFH", 10.0355555556, -10.7697222222), + ("GULB", 11.3261111111, -12.2869444444), + ("GUMA", 8.48111111111, -9.52583333333), + ("GUNZ", 7.80583333333, -8.70166666667), + ("GVAC", 16.7413888889, -22.9494444444), + ("GVBA", 16.1366666667, -22.8888888889), + ("GVFM", 14.9244444444, -23.4933333333), + ("GVMA", 15.1558333333, -23.2136111111), + ("GVSN", 16.5883333333, -24.2844444444), + ("GVSV", 16.8338888889, -25.0566666667), + ("HAAB", 8.97694444444, 38.8), + ("HAAL", 9.00361111111, 38.7255555556), + ("HABD", 11.6080555556, 37.3213888889), + ("HADR", 9.625, 41.8541666667), + ("HAGM", 8.12833333333, 34.5633333333), + ("HAGN", 12.5183333333, 37.4322222222), + ("HAHM", 8.71555555556, 39.0080555556), + ("HAJM", 7.66583333333, 36.8163888889), + ("HALL", 11.9747222222, 38.9797222222), + ("HAMK", 13.4672222222, 39.5333333333), + ("HBBA", -3.32388888889, 29.3183333333), + ("HCMB", 3.09861111111, 43.6241666667), + ("HCMH", 9.51805555556, 44.0886111111), + ("HCMI", 10.3891666667, 44.9408333333), + ("HCMK", -0.377222222222, 42.4591666667), + ("HCMM", 2.01361111111, 45.3047222222), + ("HEAR", 31.0733333333, 33.8358333333), + ("HEAT", 27.0463888889, 31.0119444444), + ("HEAX", 31.1838888889, 29.9488888889), + ("HEBL", 22.3758333333, 31.6116666667), + ("HECA", 30.1219444444, 31.4055555556), + ("HECW", 30.1161111111, 30.9152777778), + ("HEEM", 30.0744444444, 31.1919444444), + ("HEGN", 27.1838888889, 33.7983333333), + ("HEGR", 31.0688888889, 34.1291666667), + ("HELX", 25.6708333333, 32.7063888889), + ("HEMM", 31.3252777778, 27.2216666667), + ("HEPS", 31.2794444444, 32.24), + ("HESC", 28.6852777778, 34.0625), + ("HESN", 23.9641666667, 32.8197222222), + ("HETR", 28.2088888889, 33.6452777778), + ("HKEL", 0.404166666667, 35.2380555556), + ("HKGA", -0.463333333333, 39.6480555556), + ("HKIS", 0.339166666667, 37.5908333333), + ("HKKG", 0.271111111111, 34.7872222222), + ("HKKI", -0.0861111111111, 34.7288888889), + ("HKKT", 0.971944444444, 34.9583333333), + ("HKLK", 4.20416666667, 34.3480555556), + ("HKLO", 3.12194444444, 35.6086111111), + ("HKLU", -2.25222222222, 40.9130555556), + ("HKLY", 2.76305555556, 36.7183333333), + ("HKMA", 3.93361111111, 41.8441666667), + ("HKMB", 2.345, 37.9991666667), + ("HKMK", 0.230277777778, 38.1702777778), + ("HKML", -3.22916666667, 40.1016666667), + ("HKMO", -4.03472222222, 39.5941666667), + ("HKMY", 3.46972222222, 39.1013888889), + ("HKNI", -0.368888888889, 36.98), + ("HKNV", -0.787777777778, 36.4333333333), + ("HKNW", -1.32166666667, 36.8147222222), + ("HKNY", -0.0608333333333, 37.0386111111), + ("HKRE", -1.27722222222, 36.8622222222), + ("HKWJ", 1.73305555556, 40.0913888889), + ("HLFL", 28.7952777778, 22.0808333333), + ("HLGL", 28.6383333333, 21.4377777778), + ("HLGT", 25.1455555556, 10.1425), + ("HLKF", 24.1786111111, 23.3138888889), + ("HLLB", 32.0966666667, 20.2694444444), + ("HLLQ", 32.7886111111, 21.9641666667), + ("HLLS", 26.9869444444, 14.4725), + ("HLLT", 32.6633333333, 13.1588888889), + ("HLMB", 30.3780555556, 19.5763888889), + ("HLNF", 30.5, 18.5269444444), + ("HLON", 29.11, 15.9655555556), + ("HLRA", 29.4697222222, 17.9311111111), + ("HLTD", 30.1516666667, 9.71527777778), + ("HLZA", 28.59, 17.2941666667), + ("HRYG", -1.67694444444, 29.2586111111), + ("HRYR", -1.96861111111, 30.1394444444), + ("HRZA", -2.46222222222, 28.9077777778), + ("HSDN", 19.1536111111, 30.43), + ("HSDZ", 11.7858333333, 34.3363888889), + ("HSFS", 13.615, 25.3247222222), + ("HSKA", 15.3858333333, 36.3280555556), + ("HSNL", 12.0536111111, 24.9552777778), + ("HSOB", 13.1530555556, 30.2325), + ("HSSJ", 4.87194444444, 31.6011111111), + ("HSSM", 9.55861111111, 31.6525), + ("HSSP", 19.5763888889, 37.2158333333), + ("HSSS", 15.5894444444, 32.5530555556), + ("HSWW", 7.72555555556, 27.9794444444), + ("HTAR", -3.36777777778, 36.6333333333), + ("HTDA", -6.87805555556, 39.2025), + ("HTDO", -6.17027777778, 35.7525), + ("HTIR", -7.66861111111, 35.7519444444), + ("HTKJ", -3.42916666667, 37.0744444444), + ("HTLM", -3.37611111111, 35.8180555556), + ("HTMD", -3.51416666667, 33.6188888889), + ("HTMS", -3.36277777778, 37.3233333333), + ("HTMT", -10.3388888889, 40.1816666667), + ("HTMW", -2.44444444444, 32.9325), + ("HTNG", -6.71722222222, 38.1536111111), + ("HTPE", -5.25722222222, 39.8113888889), + ("HTTG", -5.09222222222, 39.0711111111), + ("HTZA", -6.22194444444, 39.2247222222), + ("HUEN", 0.0422222222222, 32.4433333333), + ("HUGU", 2.80555555556, 32.2716666667), + ("HUSO", 1.7275, 33.6227777778), + ("KABI", 32.4111111111, -99.6816666667), + ("KACK", 41.2527777778, -70.06), + ("KACT", 31.6111111111, -97.2302777778), + ("KACY", 39.4575, -74.5769444444), + ("KADM", 34.3030555556, -97.0194444444), + ("KADW", 38.8105555556, -76.8669444444), + ("KAEX", 31.3272222222, -92.5483333333), + ("KAGS", 33.3697222222, -81.9644444444), + ("KAKR", 41.0375, -81.4666666667), + ("KALB", 42.7480555556, -73.8027777778), + ("KALI", 27.7408333333, -98.0269444444), + ("KAMA", 35.2191666667, -101.705833333), + ("KANB", 33.5880555556, -85.8580555556), + ("KAND", 34.495, -82.7091666667), + ("KAOO", 40.2963888889, -78.32), + ("KAPG", 39.4661111111, -76.1694444444), + ("KARA", 30.0375, 91.8838888889), + ("KART", 43.9916666667, -76.0216666667), + ("KATL", 33.6402777778, -84.4269444444), + ("KAUG", 44.3205555556, -69.7972222222), + ("KAUS", 30.1944444444, -97.6697222222), + ("KBAB", 39.1358333333, -121.436388889), + ("KBAD", 32.5016666667, -93.6625), + ("KBCT", 26.3783333333, -80.1075), + ("KBDE", 48.7283333333, -94.6122222222), + ("KBDL", 41.9388888889, -72.6830555556), + ("KBDR", 41.1633333333, -73.1261111111), + ("KBED", 42.4697222222, -71.2888888889), + ("KBFI", 47.5297222222, -122.301944444), + ("KBFL", 35.4333333333, -119.056666667), + ("KBFM", 30.6263888889, -88.0677777778), + ("KBGR", 44.8072222222, -68.8280555556), + ("KBHM", 33.5627777778, -86.7533333333), + ("KBIF", 31.8494444444, -106.38), + ("KBIX", 30.4108333333, -88.9236111111), + ("KBKF", 39.7016666667, -104.751388889), + ("KBLI", 48.7925, -122.5375), + ("KBLV", 38.545, -89.835), + ("KBNA", 36.1244444444, -86.6780555556), + ("KBOI", 43.5641666667, -116.222777778), + ("KBOS", 42.3641666667, -71.005), + ("KBPT", 29.9508333333, -94.0205555556), + ("KBRO", 25.9066666667, -97.4258333333), + ("KBTR", 30.5330555556, -91.1494444444), + ("KBTV", 44.4716666667, -73.1530555556), + ("KBUF", 42.9402777778, -78.7319444444), + ("KBUR", 34.2005555556, -118.358611111), + ("KBWI", 39.1752777778, -76.6683333333), + ("KBYH", 35.9641666667, -89.9433333333), + ("KBYS", 35.2802777778, -116.63), + ("KCAE", 33.9386111111, -81.1194444444), + ("KCAR", 46.8713888889, -68.0177777778), + ("KCBM", 33.6438888889, -88.4436111111), + ("KCDC", 37.7008333333, -113.098611111), + ("KCDS", 34.4336111111, -100.288055556), + ("KCEF", 42.1980555556, -72.5341666667), + ("KCEW", 30.7786111111, -86.5219444444), + ("KCFD", 30.7155555556, -96.3311111111), + ("KCHA", 35.0352777778, -85.2036111111), + ("KCHS", 32.8986111111, -80.0402777778), + ("KCIC", 39.7952777778, -121.858333333), + ("KCLE", 41.4116666667, -81.8497222222), + ("KCLL", 30.5883333333, -96.3636111111), + ("KCLT", 35.2138888889, -80.9430555556), + ("KCMH", 39.9977777778, -82.8916666667), + ("KCNM", 32.3372222222, -104.263055556), + ("KCNW", 31.6377777778, -97.0738888889), + ("KCOF", 28.2347222222, -80.61), + ("KCOS", 38.8055555556, -104.7), + ("KCOT", 28.4580555556, -99.22), + ("KCOU", 38.8180555556, -92.2194444444), + ("KCPR", 42.9077777778, -106.464166667), + ("KCRP", 27.7702777778, -97.5011111111), + ("KCTB", 48.6083333333, -112.376111111), + ("KCVG", 39.0461111111, -84.6619444444), + ("KCVS", 34.3825, -103.321944444), + ("KCXL", 32.6694444444, -115.513055556), + ("KCXO", 30.3516666667, -95.4144444444), + ("KCYS", 41.1555555556, -104.811666667), + ("KDAL", 32.8469444444, -96.8516666667), + ("KDAY", 39.9022222222, -84.2191666667), + ("KDCA", 38.8519444444, -77.0375), + ("KDEN", 39.8583333333, -104.666944444), + ("KDET", 42.4091666667, -83.0097222222), + ("KDFW", 32.8963888889, -97.0375), + ("KDHN", 31.3211111111, -85.4494444444), + ("KDHT", 36.0225, -102.547222222), + ("KDLF", 29.3594444444, -100.777777778), + ("KDLH", 46.8419444444, -92.1936111111), + ("KDMA", 32.1663888889, -110.883055556), + ("KDOV", 39.13, -75.4663888889), + ("KDPA", 41.9077777778, -88.2486111111), + ("KDRI", 30.8316666667, -93.3397222222), + ("KDRO", 37.1513888889, -107.753611111), + ("KDRT", 29.3727777778, -100.925833333), + ("KDSM", 41.5338888889, -93.6625), + ("KDTW", 42.2122222222, -83.3533333333), + ("KDUG", 31.4688888889, -109.603611111), + ("KDYS", 32.4205555556, -99.8544444444), + ("KECG", 36.2605555556, -76.1744444444), + ("KEDW", 34.9052777778, -117.883611111), + ("KEFD", 29.6072222222, -95.1586111111), + ("KEGP", 28.7, -100.479444444), + ("KEKN", 38.8894444444, -79.8569444444), + ("KELD", 33.2208333333, -92.8130555556), + ("KELP", 31.8066666667, -106.377777778), + ("KEND", 36.3397222222, -97.9161111111), + ("KENV", 40.7186111111, -114.030833333), + ("KESF", 31.3947222222, -92.2955555556), + ("KEWN", 35.0727777778, -77.0427777778), + ("KEWR", 40.6922222222, -74.1686111111), + ("KEYW", 24.5561111111, -81.7594444444), + ("KFAF", 37.1325, -76.6086111111), + ("KFAT", 36.7761111111, -119.718055556), + ("KFCS", 38.6783333333, -104.756388889), + ("KFFO", 39.8261111111, -84.0483333333), + ("KFHU", 31.5883333333, -110.344166667), + ("KFLL", 26.0725, -80.1525), + ("KFLO", 34.1852777778, -79.7238888889), + ("KFLV", 39.3683333333, -94.9144444444), + ("KFME", 39.0852777778, -76.7591666667), + ("KFMH", 41.6583333333, -70.5213888889), + ("KFMN", 36.7411111111, -108.229722222), + ("KFMY", 26.5863888889, -81.8630555556), + ("KFOD", 42.5513888889, -94.1925), + ("KFOE", 38.9508333333, -95.6636111111), + ("KFOK", 40.8436111111, -72.6316666667), + ("KFRI", 39.055, -96.7644444444), + ("KFSI", 34.6497222222, -98.4019444444), + ("KFSM", 35.3363888889, -94.3672222222), + ("KFTK", 37.9069444444, -85.9719444444), + ("KFTW", 32.8197222222, -97.3622222222), + ("KFXE", 26.1972222222, -80.1705555556), + ("KFYV", 36.005, -94.17), + ("KGAG", 36.2952777778, -99.7763888889), + ("KGCK", 37.9275, -100.724166667), + ("KGEG", 47.6197222222, -117.533611111), + ("KGFK", 47.9491666667, -97.1761111111), + ("KGGG", 32.3847222222, -94.7113888889), + ("KGLS", 29.2652777778, -94.8602777778), + ("KGNT", 35.1652777778, -107.900555556), + ("KGNV", 29.69, -82.2716666667), + ("KGRB", 44.485, -88.1294444444), + ("KGRF", 47.0791666667, -122.580555556), + ("KGRK", 31.0672222222, -97.8288888889), + ("KGRR", 42.8808333333, -85.5227777778), + ("KGSB", 35.3391666667, -77.9605555556), + ("KGTB", 44.0555555556, -75.7194444444), + ("KGTF", 47.4819444444, -111.370555556), + ("KGUS", 40.6480555556, -86.1519444444), + ("KGVT", 33.0677777778, -96.0652777778), + ("KGVW", 38.8433333333, -94.5605555556), + ("KGWO", 33.4941666667, -90.0844444444), + ("KHBR", 34.9911111111, -99.0511111111), + ("KHFD", 41.7361111111, -72.65), + ("KHHR", 33.9227777778, -118.335), + ("KHIB", 47.3863888889, -92.8388888889), + ("KHIF", 41.1238888889, -111.972777778), + ("KHKY", 35.7411111111, -81.3894444444), + ("KHLN", 46.6066666667, -111.9825), + ("KHLR", 31.1386111111, -97.7144444444), + ("KHMN", 32.8525, -106.106388889), + ("KHOB", 32.6875, -103.216944444), + ("KHON", 44.385, -98.2283333333), + ("KHOP", 36.6683333333, -87.4961111111), + ("KHOU", 29.6452777778, -95.2788888889), + ("KHPN", 41.0669444444, -73.7075), + ("KHRL", 26.2283333333, -97.6541666667), + ("KHRO", 36.2613888889, -93.1547222222), + ("KHRT", 30.4277777778, -86.6891666667), + ("KHST", 25.4883333333, -80.3836111111), + ("KHTL", 44.3597222222, -84.6711111111), + ("KHUA", 34.6786111111, -86.6847222222), + ("KHUF", 39.4513888889, -87.3075), + ("KHUL", 46.1230555556, -67.7919444444), + ("KHVR", 48.5427777778, -109.762222222), + ("KHWO", 26.0013888889, -80.2402777778), + ("KIAB", 37.6227777778, -97.2672222222), + ("KIAD", 38.9444444444, -77.4555555556), + ("KIAG", 43.1072222222, -78.9461111111), + ("KIAH", 29.9802777778, -95.3397222222), + ("KICT", 37.6497222222, -97.4330555556), + ("KIKK", 41.0713888889, -87.8461111111), + ("KIKR", 35.04, -106.609166667), + ("KILG", 39.6786111111, -75.6063888889), + ("KILM", 34.2705555556, -77.9025), + ("KIND", 39.7172222222, -86.2941666667), + ("KINK", 31.7794444444, -103.201111111), + ("KINL", 48.5661111111, -93.4030555556), + ("KINS", 36.5869444444, -115.673333333), + ("KINT", 36.1336111111, -80.2219444444), + ("KIPL", 32.8341666667, -115.578611111), + ("KIPT", 41.2419444444, -76.9211111111), + ("KISN", 48.1777777778, -103.642222222), + ("KISP", 40.795, -73.1), + ("KJAN", 32.3111111111, -90.0758333333), + ("KJAX", 30.4938888889, -81.6877777778), + ("KJBR", 35.8316666667, -90.6461111111), + ("KJFK", 40.6397222222, -73.7788888889), + ("KLAN", 42.7786111111, -84.5872222222), + ("KLAS", 36.0802777778, -115.152222222), + ("KLAX", 33.9425, -118.408055556), + ("KLBB", 33.6636111111, -101.822777778), + ("KLCH", 30.1261111111, -93.2233333333), + ("KLCK", 39.8136111111, -82.9277777778), + ("KLFI", 37.0827777778, -76.3602777778), + ("KLFK", 31.2338888889, -94.75), + ("KLFT", 30.2052777778, -91.9875), + ("KLGA", 40.7772222222, -73.8725), + ("KLGB", 33.8175, -118.151388889), + ("KLHW", 31.8888888889, -81.5622222222), + ("KLIT", 34.7294444444, -92.2241666667), + ("KLNA", 26.5927777778, -80.085), + ("KLNK", 40.8508333333, -96.7591666667), + ("KLOU", 38.2277777778, -85.6636111111), + ("KLRD", 27.5436111111, -99.4613888889), + ("KLRF", 34.9180555556, -92.1463888889), + ("KLSF", 32.3372222222, -84.9911111111), + ("KLSV", 36.2361111111, -115.034166667), + ("KLTS", 34.6669444444, -99.2666666667), + ("KLUF", 33.535, -112.383055556), + ("KLUK", 39.1033333333, -84.4186111111), + ("KMAF", 31.9425, -102.201666667), + ("KMCC", 38.6675, -121.400555556), + ("KMCF", 27.8491666667, -82.5211111111), + ("KMCI", 39.2975, -94.7138888889), + ("KMCN", 32.6927777778, -83.6491666667), + ("KMCO", 28.4288888889, -81.3158333333), + ("KMDT", 40.1933333333, -76.7633333333), + ("KMDW", 41.7858333333, -87.7522222222), + ("KMEM", 35.0422222222, -89.9766666667), + ("KMER", 37.3802777778, -120.568055556), + ("KMFE", 26.1758333333, -98.2386111111), + ("KMGE", 33.9152777778, -84.5161111111), + ("KMHR", 38.5538888889, -121.2975), + ("KMIA", 25.7930555556, -80.2905555556), + ("KMIB", 48.4155555556, -101.3575), + ("KMIV", 39.3677777778, -75.0722222222), + ("KMKE", 42.9472222222, -87.8963888889), + ("KMKL", 35.5997222222, -88.9155555556), + ("KMKO", 35.6575, -95.3613888889), + ("KMLB", 28.1025, -80.645), + ("KMLC", 34.8822222222, -95.7833333333), + ("KMLT", 45.6477777778, -68.6855555556), + ("KMLU", 32.5108333333, -92.0375), + ("KMMV", 45.1944444444, -123.135833333), + ("KMNM", 45.1263888889, -87.6383333333), + ("KMOB", 30.6913888889, -88.2427777778), + ("KMOD", 37.6255555556, -120.954166667), + ("KMOT", 48.2591666667, -101.280277778), + ("KMPV", 44.2033333333, -72.5622222222), + ("KMQT", 46.5338888889, -87.5616666667), + ("KMSN", 43.1397222222, -89.3375), + ("KMSP", 44.8802777778, -93.2166666667), + ("KMSS", 44.9358333333, -74.8452777778), + ("KMSY", 29.9933333333, -90.2577777778), + ("KMTC", 42.6127777778, -82.8316666667), + ("KMUI", 40.4347222222, -76.5691666667), + ("KMUO", 43.0433333333, -115.872222222), + ("KMWH", 47.2075, -119.32), + ("KMWL", 32.7813888889, -98.06), + ("KMXF", 32.3791666667, -86.3625), + ("KMYR", 33.6797222222, -78.9283333333), + ("KNBC", 32.4772222222, -80.7230555556), + ("KNBG", 29.8252777778, -90.035), + ("KNCA", 34.7083333333, -77.4394444444), + ("KNEL", 40.0333333333, -74.3533333333), + ("KNFL", 39.4163888889, -118.700833333), + ("KNGU", 36.9375, -76.2891666667), + ("KNHK", 38.2858333333, -76.4116666667), + ("KNID", 35.6877777778, -117.690555556), + ("KNIP", 30.2358333333, -81.6805555556), + ("KNJK", 32.8291666667, -115.671666667), + ("KNKT", 34.9025, -76.8808333333), + ("KNKX", 32.8683333333, -117.1425), + ("KNLC", 36.3327777778, -119.951944444), + ("KNMM", 32.5519444444, -88.5555555556), + ("KNOW", 48.1413888889, -123.413888889), + ("KNPA", 30.3525, -87.3186111111), + ("KNQA", 35.3566666667, -89.8702777778), + ("KNQI", 27.5072222222, -97.8097222222), + ("KNQX", 24.5758333333, -81.6888888889), + ("KNSE", 30.7241666667, -87.0219444444), + ("KNTD", 34.1202777778, -119.120833333), + ("KNTK", 33.7061111111, -117.827222222), + ("KNTU", 36.8205555556, -76.0333333333), + ("KNUQ", 37.415, -122.048055556), + ("KNUW", 48.3516666667, -122.655833333), + ("KNXP", 34.2961111111, -116.161944444), + ("KNXX", 40.1997222222, -75.1480555556), + ("KNYG", 38.5016666667, -77.3052777778), + ("KNZC", 30.2186111111, -81.8763888889), + ("KNZY", 32.6991666667, -117.215277778), + ("KOAK", 37.7211111111, -122.220555556), + ("KOFF", 41.1183333333, -95.9125), + ("KOGS", 44.6819444444, -75.4655555556), + ("KOKC", 35.3930555556, -97.6005555556), + ("KOLS", 31.4175, -110.847777778), + ("KOMA", 41.3025, -95.8936111111), + ("KONT", 34.0558333333, -117.601111111), + ("KOPF", 25.9069444444, -80.2783333333), + ("KORD", 41.9794444444, -87.9044444444), + ("KORF", 36.8944444444, -76.2011111111), + ("KORL", 28.5452777778, -81.3327777778), + ("KOSC", 44.4513888889, -83.3938888889), + ("KPAE", 47.9061111111, -122.281388889), + ("KPAM", 30.0697222222, -85.5763888889), + ("KPBF", 34.1747222222, -91.9344444444), + ("KPBG", 44.6508333333, -73.4680555556), + ("KPBI", 26.6830555556, -80.0955555556), + ("KPDX", 45.5886111111, -122.5975), + ("KPHF", 37.1316666667, -76.4927777778), + ("KPHL", 39.8719444444, -75.2411111111), + ("KPHN", 42.9108333333, -82.5286111111), + ("KPHX", 33.4341666667, -112.008055556), + ("KPIE", 27.9105555556, -82.6872222222), + ("KPIT", 40.4913888889, -80.2327777778), + ("KPMB", 48.9425, -97.2408333333), + ("KPMD", 34.6291666667, -118.084444444), + ("KPNC", 36.7305555556, -97.0997222222), + ("KPNE", 40.0819444444, -75.0105555556), + ("KPNM", 45.5597222222, -93.6080555556), + ("KPNS", 30.4730555556, -87.1872222222), + ("KPOB", 35.1708333333, -79.0144444444), + ("KPOE", 31.0447222222, -93.1913888889), + ("KPQI", 46.6888888889, -68.0447222222), + ("KPRC", 34.6544444444, -112.419444444), + ("KPSP", 33.8294444444, -116.506666667), + ("KPSX", 28.7275, -96.2508333333), + ("KPUB", 38.2888888889, -104.496388889), + ("KPVD", 41.7238888889, -71.4280555556), + ("KPWM", 43.6461111111, -70.3086111111), + ("KRAL", 33.9516666667, -117.445), + ("KRBM", 34.85, -92.3), + ("KRCA", 44.145, -103.103333333), + ("KRDR", 47.9608333333, -97.4011111111), + ("KRDU", 35.8775, -78.7872222222), + ("KRIC", 37.505, -77.3194444444), + ("KRIU", 38.4886111111, -121.102222222), + ("KRIV", 33.8805555556, -117.259444444), + ("KRME", 43.2336111111, -75.4069444444), + ("KRND", 29.5294444444, -98.2788888889), + ("KRNO", 39.4983333333, -119.768055556), + ("KROC", 43.1186111111, -77.6722222222), + ("KROW", 33.3013888889, -104.530555556), + ("KRSW", 26.5361111111, -81.755), + ("KSAC", 38.5125, -121.493333333), + ("KSAF", 35.6166666667, -106.088055556), + ("KSAN", 32.7333333333, -117.189444444), + ("KSAT", 29.5336111111, -98.4697222222), + ("KSAV", 32.1275, -81.2019444444), + ("KSAW", 46.3536111111, -87.3958333333), + ("KSBO", 32.6083333333, -82.3686111111), + ("KSBY", 38.3402777778, -75.5102777778), + ("KSCK", 37.8941666667, -121.238611111), + ("KSEA", 47.4488888889, -122.309166667), + ("KSEM", 32.3438888889, -86.9877777778), + ("KSFF", 47.6827777778, -117.3225), + ("KSFO", 37.6188888889, -122.374722222), + ("KSFZ", 41.9205555556, -71.4911111111), + ("KSHV", 32.4463888889, -93.8255555556), + ("KSJC", 37.3616666667, -121.928888889), + ("KSJT", 31.3575, -100.496111111), + ("KSKA", 47.615, -117.655555556), + ("KSKF", 29.3841666667, -98.5808333333), + ("KSKY", 41.4333333333, -82.6522222222), + ("KSLC", 40.7883333333, -111.9775), + ("KSMF", 38.6952777778, -121.590555556), + ("KSNA", 33.6755555556, -117.868055556), + ("KSPB", 45.7725, -122.862222222), + ("KSPG", 27.765, -82.6269444444), + ("KSPS", 33.9886111111, -98.4916666667), + ("KSSC", 33.9727777778, -80.4727777778), + ("KSTL", 38.7475, -90.3597222222), + ("KSUU", 38.2625, -121.927222222), + ("KSUX", 42.4025, -96.3841666667), + ("KSVN", 32.01, -81.1455555556), + ("KSWF", 41.5038888889, -74.1047222222), + ("KSYR", 43.1111111111, -76.1061111111), + ("KSZL", 38.7302777778, -93.5477777778), + ("KTBN", 37.7413888889, -92.1405555556), + ("KTCC", 35.1827777778, -103.603055556), + ("KTCM", 47.1375, -122.476388889), + ("KTCS", 33.2369444444, -107.271666667), + ("KTEB", 40.8497222222, -74.0608333333), + ("KTIK", 35.4147222222, -97.3863888889), + ("KTLH", 30.3963888889, -84.3502777778), + ("KTMB", 25.6477777778, -80.4327777778), + ("KTNT", 25.8616666667, -80.8969444444), + ("KTNX", 37.7944444444, -116.778611111), + ("KTPA", 27.9752777778, -82.5330555556), + ("KTTN", 40.2766666667, -74.8133333333), + ("KTUL", 36.1983333333, -95.8880555556), + ("KTUS", 32.1161111111, -110.941388889), + ("KTXK", 33.4536111111, -93.9908333333), + ("KTYR", 32.3538888889, -95.4022222222), + ("KTYS", 35.8122222222, -83.9927777778), + ("KUGN", 42.4219444444, -87.8677777778), + ("KVAD", 30.9677777778, -83.1927777778), + ("KVBG", 34.7294444444, -120.576666667), + ("KVCV", 34.5930555556, -117.379444444), + ("KVPS", 30.4830555556, -86.5252777778), + ("KVRB", 27.6555555556, -80.4177777778), + ("KWAL", 37.94, -75.4663888889), + ("KWRB", 32.64, -83.5916666667), + ("KWRI", 40.0155555556, -74.5936111111), + ("KWSD", 32.3413888889, -106.4025), + ("KWWD", 39.0083333333, -74.9080555556), + ("KYIP", 42.2377777778, -83.5302777778), + ("KYNG", 41.2605555556, -80.6788888889), + ("KYUM", 32.6563888889, -114.605833333), + ("KZUN", 35.0833333333, -108.791666667), + ("LATI", 41.4147222222, 19.7205555556), + ("LBBG", 42.5688888889, 27.5138888889), + ("LBGO", 43.1513888889, 25.7127777778), + ("LBPD", 42.0677777778, 24.8508333333), + ("LBSF", 42.695, 23.4061111111), + ("LBSZ", 42.3766666667, 25.655), + ("LBWN", 43.2319444444, 27.825), + ("LCLK", 34.875, 33.6247222222), + ("LCPH", 34.7177777778, 32.4855555556), + ("LCRA", 34.5902777778, 32.9877777778), + ("LDDU", 42.5611111111, 18.2680555556), + ("LDOC", 45.5419444444, 18.6361111111), + ("LDOS", 45.4625, 18.8113888889), + ("LDPL", 44.8933333333, 13.9219444444), + ("LDRG", 45.3794444444, 14.5036111111), + ("LDRI", 45.2166666667, 14.57), + ("LDSP", 43.5388888889, 16.2977777778), + ("LDVA", 46.2947222222, 16.3811111111), + ("LDZA", 45.7427777778, 16.0686111111), + ("LDZD", 44.1080555556, 15.3466666667), + ("LDZU", 44.5575, 15.7741666667), + ("LEAB", 38.9483333333, -1.86333333333), + ("LEAL", 38.2819444444, -0.558055555556), + ("LEAM", 36.8438888889, -2.37), + ("LEAS", 43.5633333333, -6.03444444444), + ("LEBA", 37.8419444444, -4.84861111111), + ("LEBB", 43.3008333333, -2.91055555556), + ("LEBG", 42.3575, -3.62055555556), + ("LEBL", 41.2969444444, 2.07833333333), + ("LEBZ", 38.8911111111, -6.82111111111), + ("LECO", 43.3019444444, -8.37722222222), + ("LEGA", 37.1330555556, -3.63555555556), + ("LEGE", 41.9008333333, 2.76027777778), + ("LEGR", 37.1886111111, -3.77722222222), + ("LEGT", 40.2938888889, -3.72361111111), + ("LEIB", 38.8727777778, 1.37305555556), + ("LEJR", 36.7444444444, -6.06), + ("LELC", 37.7747222222, -0.812222222222), + ("LELN", 42.5888888889, -5.65555555556), + ("LEMD", 40.4722222222, -3.56083333333), + ("LEMG", 36.6736111111, -4.49888888889), + ("LEMH", 39.8625, 4.21861111111), + ("LEMM", 40.4166666667, -3.5), + ("LEMO", 37.1747222222, -5.61583333333), + ("LEOC", 39.9375, -3.50333333333), + ("LEPA", 39.55, 2.73333333333), + ("LEPP", 42.77, -1.64611111111), + ("LERI", 37.9511111111, -1.23027777778), + ("LERS", 41.1472222222, 1.16694444444), + ("LERT", 36.645, -6.34944444444), + ("LESA", 40.9519444444, -5.50194444444), + ("LESB", 39.5988888889, 2.70277777778), + ("LESJ", 39.5516666667, 2.73861111111), + ("LESL", 39.8622222222, 4.25833333333), + ("LESO", 43.3563888889, -1.79055555556), + ("LEST", 42.8961111111, -8.415), + ("LESU", 42.3386111111, 1.40916666667), + ("LETO", 40.4866666667, -3.45805555556), + ("LEVC", 39.4891666667, -0.481388888889), + ("LEVD", 41.7061111111, -4.85194444444), + ("LEVS", 40.3705555556, -3.785), + ("LEVT", 42.8827777778, -2.72444444444), + ("LEVX", 42.2316666667, -8.62666666667), + ("LEXJ", 43.4269444444, -3.82), + ("LEZG", 41.6661111111, -1.04138888889), + ("LEZL", 37.4177777778, -5.89305555556), + ("LFAC", 50.9619444444, 1.95472222222), + ("LFAG", 49.8688888889, 3.02777777778), + ("LFAI", 48.5936111111, 3.005), + ("LFAO", 48.5458333333, -0.387222222222), + ("LFAQ", 49.9713888889, 2.69972222222), + ("LFAT", 50.5147222222, 1.62722222222), + ("LFAV", 50.3255555556, 3.46111111111), + ("LFAY", 49.8713888889, 2.38638888889), + ("LFBA", 44.1747222222, 0.590555555556), + ("LFBC", 44.5333333333, -1.125), + ("LFBD", 44.8283333333, -0.715555555556), + ("LFBE", 44.8252777778, 0.518611111111), + ("LFBF", 43.5455555556, 1.3675), + ("LFBG", 45.6583333333, -0.3175), + ("LFBI", 46.5875, 0.306666666667), + ("LFBK", 46.2244444444, 2.36305555556), + ("LFBL", 45.8627777778, 1.17944444444), + ("LFBM", 43.9116666667, -0.5075), + ("LFBN", 46.3111111111, -0.401388888889), + ("LFBO", 43.6288888889, 1.36361111111), + ("LFBP", 43.38, -0.418611111111), + ("LFBR", 43.4488888889, 1.26333333333), + ("LFBT", 43.1786111111, -0.00638888888889), + ("LFBU", 45.7291666667, 0.221388888889), + ("LFBV", 45.1508333333, 1.46916666667), + ("LFBX", 45.1980555556, 0.815555555556), + ("LFBZ", 43.4683333333, -1.52305555556), + ("LFCC", 44.3511111111, 1.47527777778), + ("LFCG", 43.0075, 1.10305555556), + ("LFCH", 44.5963888889, -1.11083333333), + ("LFCI", 43.9136111111, 2.11305555556), + ("LFCK", 43.5561111111, 2.28916666667), + ("LFCL", 43.5861111111, 1.49916666667), + ("LFCM", 43.99, 3.18305555556), + ("LFCR", 44.4077777778, 2.4825), + ("LFCU", 45.5347222222, 2.42388888889), + ("LFCW", 44.3969444444, 0.758888888889), + ("LFCY", 45.6280555556, -0.9725), + ("LFCZ", 44.1461111111, -1.17444444444), + ("LFDA", 43.7094444444, -0.245277777778), + ("LFDB", 44.0255555556, 1.37777777778), + ("LFDH", 43.6877777778, 0.601666666667), + ("LFDI", 44.9822222222, -0.134722222222), + ("LFDJ", 43.0905555556, 1.69583333333), + ("LFDM", 44.4988888889, 0.200277777778), + ("LFDN", 45.8877777778, -0.983055555556), + ("LFEC", 48.4627777778, -5.06388888889), + ("LFED", 48.0583333333, -2.92166666667), + ("LFES", 48.0525, -3.66444444444), + ("LFEY", 46.7186111111, -2.39111111111), + ("LFFI", 47.4080555556, -1.1775), + ("LFFN", 48.4297222222, 4.48111111111), + ("LFGA", 48.1097222222, 7.35888888889), + ("LFGF", 47.0058333333, 4.89333333333), + ("LFGJ", 47.0388888889, 5.42722222222), + ("LFGK", 47.9922222222, 3.39222222222), + ("LFGW", 49.1222222222, 5.46888888889), + ("LFHO", 44.5441666667, 4.37194444444), + ("LFHP", 45.0794444444, 3.76472222222), + ("LFHQ", 45.0763888889, 2.99361111111), + ("LFHS", 46.2008333333, 5.29194444444), + ("LFHV", 45.9163888889, 4.64055555556), + ("LFHY", 46.5344444444, 3.42361111111), + ("LFIG", 44.1775, 2.515), + ("LFIO", 43.5688888889, 1.48083333333), + ("LFJL", 48.9822222222, 6.25361111111), + ("LFKB", 42.5538888889, 9.48333333333), + ("LFKC", 42.5305555556, 8.79305555556), + ("LFKF", 41.5005555556, 9.09777777778), + ("LFKJ", 41.9236111111, 8.80277777778), + ("LFKO", 41.6630555556, 8.89027777778), + ("LFKS", 41.9241666667, 9.40583333333), + ("LFKT", 42.2936111111, 9.19305555556), + ("LFLA", 47.85, 3.49694444444), + ("LFLB", 45.6377777778, 5.88), + ("LFLC", 45.7863888889, 3.16916666667), + ("LFLD", 47.0580555556, 2.37027777778), + ("LFLE", 45.5608333333, 5.97555555556), + ("LFLH", 46.8258333333, 4.8175), + ("LFLI", 46.1919444444, 6.26833333333), + ("LFLL", 45.7261111111, 5.09083333333), + ("LFLM", 46.295, 4.79555555556), + ("LFLN", 46.4125, 4.01305555556), + ("LFLO", 46.0583333333, 4.00138888889), + ("LFLP", 45.9291666667, 6.09861111111), + ("LFLS", 45.3627777778, 5.32916666667), + ("LFLT", 46.3525, 2.57027777778), + ("LFLU", 44.9213888889, 4.96972222222), + ("LFLV", 46.1694444444, 3.40361111111), + ("LFLW", 44.8913888889, 2.42194444444), + ("LFLX", 46.8619444444, 1.73055555556), + ("LFLY", 45.7280555556, 4.94472222222), + ("LFMA", 43.5052777778, 5.36777777778), + ("LFMC", 43.3844444444, 6.38694444444), + ("LFMD", 43.5419444444, 6.95333333333), + ("LFMH", 45.5402777778, 4.29638888889), + ("LFMI", 43.5225, 4.92361111111), + ("LFMK", 43.2158333333, 2.30611111111), + ("LFML", 43.4355555556, 5.21361111111), + ("LFMN", 43.6605555556, 7.2175), + ("LFMO", 44.1402777778, 4.86666666667), + ("LFMP", 42.7402777778, 2.87055555556), + ("LFMQ", 43.2525, 5.785), + ("LFMS", 44.0694444444, 4.14194444444), + ("LFMT", 43.5761111111, 3.96277777778), + ("LFMU", 43.3238888889, 3.35555555556), + ("LFMV", 43.9072222222, 4.90166666667), + ("LFMY", 43.6063888889, 5.10916666667), + ("LFMZ", 43.1758333333, 2.73416666667), + ("LFNB", 44.5019444444, 3.53277777778), + ("LFNH", 44.0297222222, 5.07805555556), + ("LFOA", 47.0533333333, 2.6325), + ("LFOB", 49.4544444444, 2.11277777778), + ("LFOC", 48.0580555556, 1.37638888889), + ("LFOD", 47.2566666667, -0.115), + ("LFOE", 49.0286111111, 1.21972222222), + ("LFOH", 49.5338888889, 0.0880555555556), + ("LFOI", 50.1433333333, 1.83166666667), + ("LFOJ", 47.9877777778, 1.76055555556), + ("LFOK", 48.7758333333, 4.18444444444), + ("LFOP", 49.3841666667, 1.17472222222), + ("LFOT", 47.4322222222, 0.7275), + ("LFOU", 47.0819444444, -0.876944444444), + ("LFOV", 48.0311111111, -0.742777777778), + ("LFOZ", 47.8969444444, 2.16333333333), + ("LFPB", 48.9694444444, 2.44138888889), + ("LFPC", 49.2533333333, 2.51888888889), + ("LFPG", 49.0127777778, 2.55), + ("LFPK", 48.8375, 3.01611111111), + ("LFPM", 48.6047222222, 2.67111111111), + ("LFPN", 48.7516666667, 2.10611111111), + ("LFPO", 48.7252777778, 2.35944444444), + ("LFPT", 49.0963888889, 2.04083333333), + ("LFPV", 48.7741666667, 2.20138888889), + ("LFPY", 48.5966666667, 2.33138888889), + ("LFQA", 49.2077777778, 4.15666666667), + ("LFQB", 48.3227777778, 4.01777777778), + ("LFQC", 48.5972222222, 6.54472222222), + ("LFQE", 49.2266666667, 5.67194444444), + ("LFQF", 46.9663888889, 4.26027777778), + ("LFQG", 47.0011111111, 3.11444444444), + ("LFQI", 50.2216666667, 3.15416666667), + ("LFQJ", 50.3102777778, 4.03305555556), + ("LFQM", 47.2083333333, 6.08305555556), + ("LFQP", 48.7661111111, 7.20027777778), + ("LFQQ", 50.5616666667, 3.08944444444), + ("LFQT", 50.6183333333, 2.64222222222), + ("LFQV", 49.7838888889, 4.64694444444), + ("LFQW", 47.6375, 6.20388888889), + ("LFRA", 47.4972222222, -0.5725), + ("LFRB", 48.4477777778, -4.41833333333), + ("LFRC", 49.65, -1.47027777778), + ("LFRD", 48.5877777778, -2.08), + ("LFRE", 47.2894444444, -2.34638888889), + ("LFRF", 48.8830555556, -1.56416666667), + ("LFRG", 49.3652777778, 0.154166666667), + ("LFRH", 47.7605555556, -3.44), + ("LFRI", 46.7019444444, -1.37861111111), + ("LFRJ", 48.53, -4.15138888889), + ("LFRK", 49.1733333333, -0.45), + ("LFRL", 48.2816666667, -4.445), + ("LFRM", 47.9486111111, 0.201666666667), + ("LFRN", 48.0694444444, -1.73472222222), + ("LFRO", 48.7541666667, -3.47138888889), + ("LFRQ", 47.9747222222, -4.16777777778), + ("LFRS", 47.1530555556, -1.61055555556), + ("LFRT", 48.5377777778, -2.85444444444), + ("LFRU", 48.6030555556, -3.81555555556), + ("LFRV", 47.7230555556, -2.71833333333), + ("LFRZ", 47.3119444444, -2.14916666667), + ("LFSB", 47.5894444444, 7.52972222222), + ("LFSC", 47.9219444444, 7.39944444444), + ("LFSD", 47.2688888889, 5.09), + ("LFSF", 49.0716666667, 6.13166666667), + ("LFSG", 48.3247222222, 6.06972222222), + ("LFSH", 48.7933333333, 7.81611111111), + ("LFSI", 48.6358333333, 4.89916666667), + ("LFSL", 48.78, 5.97972222222), + ("LFSM", 47.4869444444, 6.7925), + ("LFSN", 48.6919444444, 6.23027777778), + ("LFSO", 48.5830555556, 5.955), + ("LFSP", 46.9044444444, 6.32694444444), + ("LFSR", 49.31, 4.05), + ("LFST", 48.5380555556, 7.62805555556), + ("LFSX", 47.7830555556, 6.36388888889), + ("LFTF", 43.2477777778, 6.12666666667), + ("LFTH", 43.0972222222, 6.14583333333), + ("LFTW", 43.7572222222, 4.41611111111), + ("LFVM", 47.0952777778, -56.3802777778), + ("LFVP", 46.7625, -56.1752777778), + ("LFXA", 45.9872222222, 5.32833333333), + ("LFXI", 44.0566666667, 5.49527777778), + ("LFYD", 48.0847222222, 5.665), + ("LFYG", 50.1413888889, 3.26305555556), + ("LFYH", 47.335, 5.51361111111), + ("LFYL", 47.7044444444, 6.54583333333), + ("LFYT", 49.7583333333, 3.21194444444), + ("LGAD", 37.9205555556, 21.2925), + ("LGAG", 38.6019444444, 21.3511111111), + ("LGAL", 40.8558333333, 25.9561111111), + ("LGAT", 37.8877777778, 23.7316666667), + ("LGAX", 40.6511111111, 22.4886111111), + ("LGBL", 39.2194444444, 22.7941666667), + ("LGEL", 38.0636111111, 23.5558333333), + ("LGHI", 38.3430555556, 26.1405555556), + ("LGIO", 39.6963888889, 20.8225), + ("LGIR", 35.3394444444, 25.1802777778), + ("LGKA", 40.4494444444, 21.2761111111), + ("LGKC", 36.2741666667, 23.0169444444), + ("LGKF", 38.1197222222, 20.5005555556), + ("LGKL", 37.0683333333, 22.0255555556), + ("LGKM", 40.9722222222, 24.3416666667), + ("LGKO", 36.7933333333, 27.0916666667), + ("LGKP", 35.4213888889, 27.1458333333), + ("LGKR", 39.6019444444, 19.9116666667), + ("LGKS", 35.4211111111, 26.91), + ("LGKV", 40.9130555556, 24.6191666667), + ("LGKZ", 40.2861111111, 21.8408333333), + ("LGLE", 37.1847222222, 26.8002777778), + ("LGLM", 39.9169444444, 25.2361111111), + ("LGLR", 39.65, 22.4652777778), + ("LGMG", 37.9811111111, 23.3652777778), + ("LGMK", 37.435, 25.3480555556), + ("LGMR", 38.145, 24.0141666667), + ("LGMT", 39.0566666667, 26.5983333333), + ("LGPZ", 38.9252777778, 20.7652777778), + ("LGRD", 36.3830555556, 28.1088888889), + ("LGRP", 36.4052777778, 28.0861111111), + ("LGRX", 38.1511111111, 21.4255555556), + ("LGSA", 35.5316666667, 24.1494444444), + ("LGSK", 39.1769444444, 23.5036111111), + ("LGSM", 37.69, 26.9116666667), + ("LGSO", 37.4227777778, 24.9508333333), + ("LGSP", 36.9733333333, 22.5261111111), + ("LGSR", 36.4002777778, 25.4786111111), + ("LGST", 35.2136111111, 26.0975), + ("LGSV", 39.48, 22.7672222222), + ("LGSY", 38.9675, 24.4872222222), + ("LGTG", 38.3397222222, 23.5647222222), + ("LGTL", 35.1869444444, 25.3266666667), + ("LGTP", 37.5308333333, 22.405), + ("LGTS", 40.5197222222, 22.9708333333), + ("LGTT", 38.1088888889, 23.7836111111), + ("LGZA", 37.75, 20.8819444444), + ("LHBP", 47.4366666667, 19.2555555556), + ("LHDC", 47.4888888889, 21.6152777778), + ("LHGD", 47.5708333333, 19.3386111111), + ("LHKE", 46.9175, 19.7491666667), + ("LHKV", 46.3891666667, 17.7313888889), + ("LHNY", 47.9838888889, 21.6922222222), + ("LHOY", 46.3038888889, 18.7691666667), + ("LHPA", 47.3638888889, 17.5008333333), + ("LHSA", 47.0777777778, 17.9683333333), + ("LHSK", 46.8580555556, 18.0955555556), + ("LHSM", 46.6863888889, 17.1588888889), + ("LHSN", 47.1227777778, 20.2352777778), + ("LHTA", 46.3930555556, 17.9172222222), + ("LHTL", 47.3452777778, 18.9808333333), + ("LIBA", 41.5386111111, 15.7133333333), + ("LIBC", 38.9972222222, 17.08), + ("LIBD", 41.1383333333, 16.7605555556), + ("LIBF", 41.4327777778, 15.535), + ("LIBG", 40.5161111111, 17.4022222222), + ("LIBN", 40.2386111111, 18.1330555556), + ("LIBP", 42.4313888889, 14.1808333333), + ("LIBR", 40.6575, 17.9469444444), + ("LIBV", 40.7677777778, 16.9333333333), + ("LICA", 38.9063888889, 16.2422222222), + ("LICC", 37.4666666667, 15.0661111111), + ("LICD", 35.4977777778, 12.6180555556), + ("LICG", 36.8163888889, 11.9686111111), + ("LICJ", 38.1758333333, 13.0908333333), + ("LICP", 38.1108333333, 13.3133333333), + ("LICR", 38.0711111111, 15.6513888889), + ("LICT", 37.9125, 12.4880555556), + ("LICZ", 37.4013888889, 14.9222222222), + ("LIEA", 40.6319444444, 8.29055555556), + ("LIED", 39.3541666667, 8.97222222222), + ("LIEE", 39.2513888889, 9.05416666667), + ("LIEO", 40.8986111111, 9.5175), + ("LIET", 39.9186111111, 9.68277777778), + ("LIIB", 40.4166666667, 12.3333333333), + ("LIMA", 45.0861111111, 7.60305555556), + ("LIMB", 45.5397222222, 9.20222222222), + ("LIMC", 45.6313888889, 8.72777777778), + ("LIME", 45.6738888889, 9.70416666667), + ("LIMF", 45.2005555556, 7.64944444444), + ("LIMG", 44.0505555556, 8.12722222222), + ("LIMJ", 44.4119444444, 8.84166666667), + ("LIML", 45.4452777778, 9.27694444444), + ("LIMN", 45.5294444444, 8.66916666667), + ("LIMP", 44.8244444444, 10.2961111111), + ("LIMS", 44.9130555556, 9.72333333333), + ("LIMW", 45.7383333333, 7.36777777778), + ("LIMZ", 44.5463888889, 7.62222222222), + ("LIPA", 46.0316666667, 12.5963888889), + ("LIPB", 46.4605555556, 11.3261111111), + ("LIPC", 44.2236111111, 12.3061111111), + ("LIPE", 44.5341666667, 11.2902777778), + ("LIPH", 45.6486111111, 12.1952777778), + ("LIPI", 45.9805555556, 13.0544444444), + ("LIPK", 44.1947222222, 12.07), + ("LIPL", 45.4319444444, 10.2675), + ("LIPN", 45.4719444444, 10.9277777778), + ("LIPO", 45.4288888889, 10.3305555556), + ("LIPQ", 45.8277777778, 13.4663888889), + ("LIPR", 44.0202777778, 12.6119444444), + ("LIPS", 45.6844444444, 12.0861111111), + ("LIPT", 45.5741666667, 11.5305555556), + ("LIPU", 45.3955555556, 11.8477777778), + ("LIPX", 45.3955555556, 10.8883333333), + ("LIPZ", 45.505, 12.3516666667), + ("LIQS", 43.2572222222, 11.2541666667), + ("LIRA", 41.7991666667, 12.5947222222), + ("LIRE", 41.6536111111, 12.4444444444), + ("LIRF", 41.8127777778, 12.2530555556), + ("LIRG", 41.9902777778, 12.7408333333), + ("LIRI", 40.6202777778, 14.9111111111), + ("LIRJ", 42.7602777778, 10.2394444444), + ("LIRL", 41.5422222222, 12.9088888889), + ("LIRM", 41.0608333333, 14.0819444444), + ("LIRN", 40.8858333333, 14.2905555556), + ("LIRP", 43.6838888889, 10.3925), + ("LIRQ", 43.8097222222, 11.205), + ("LIRS", 42.7608333333, 11.0722222222), + ("LIRU", 41.9519444444, 12.4988888889), + ("LIRV", 42.4302777778, 12.0641666667), + ("LIRZ", 43.0958333333, 12.5130555556), + ("LJCE", 45.8997222222, 15.53), + ("LJLJ", 46.2236111111, 14.4575), + ("LJMB", 46.4797222222, 15.6861111111), + ("LJPZ", 45.4733333333, 13.6147222222), + ("LJSG", 46.4719444444, 15.1169444444), + ("LKCS", 48.9461111111, 14.4272222222), + ("LKCT", 49.6844444444, 15.6761111111), + ("LKCV", 49.9394444444, 15.3816666667), + ("LKHK", 50.2530555556, 15.845), + ("LKKB", 50.1211111111, 14.5436111111), + ("LKKU", 49.0294444444, 17.4397222222), + ("LKKV", 50.2027777778, 12.9147222222), + ("LKLN", 49.675, 13.2744444444), + ("LKMH", 50.54, 15.0063888889), + ("LKMT", 49.6963888889, 18.1111111111), + ("LKNA", 49.1658333333, 16.1247222222), + ("LKPD", 50.0133333333, 15.7386111111), + ("LKPM", 49.7186111111, 14.0969444444), + ("LKPO", 49.4258333333, 17.4047222222), + ("LKPR", 50.1008333333, 14.26), + ("LKSO", 49.2447222222, 14.7136111111), + ("LKTB", 49.1511111111, 16.6941666667), + ("LKVO", 50.2163888889, 14.3955555556), + ("LLBG", 32.0094444444, 34.8766666667), + ("LLBS", 31.2869444444, 34.7227777778), + ("LLEK", 31.8394444444, 34.8216666667), + ("LLES", 32.4408333333, 35.0061111111), + ("LLET", 29.5611111111, 34.96), + ("LLEY", 30.6230555556, 35.2019444444), + ("LLHA", 32.8111111111, 35.0438888889), + ("LLHS", 31.7625, 34.7272222222), + ("LLIB", 32.9808333333, 35.5716666667), + ("LLJR", 31.8666666667, 35.2166666667), + ("LLLL", 31.2286111111, 35.1908333333), + ("LLMG", 32.5986111111, 35.2283333333), + ("LLMZ", 31.3280555556, 35.3883333333), + ("LLNV", 31.2083333333, 35.0122222222), + ("LLOV", 29.94, 34.9358333333), + ("LLRD", 32.6602777778, 35.1822222222), + ("LLRM", 30.7761111111, 34.6666666667), + ("LLSD", 32.1144444444, 34.7819444444), + ("LMML", 35.8572222222, 14.4775), + ("LMMM", 35.9166666667, 14.4166666667), + ("LOAN", 47.8433333333, 16.26), + ("LOLW", 48.1830555556, 14.0408333333), + ("LOWG", 47.0, 15.4333333333), + ("LOWI", 47.26, 11.3438888889), + ("LOWK", 46.65, 14.3333333333), + ("LOWL", 48.2333333333, 14.1833333333), + ("LOWM", 48.0, 16.5), + ("LOWS", 47.7930555556, 13.0041666667), + ("LOWW", 48.1102777778, 16.5697222222), + ("LOXG", 46.9908333333, 15.4394444444), + ("LOXK", 46.6425, 14.3375), + ("LOXL", 48.2330555556, 14.1875), + ("LOXT", 48.3208333333, 16.1116666667), + ("LOXZ", 47.2027777778, 14.7441666667), + ("LPAR", 38.8830555556, -9.03), + ("LPAZ", 36.9713888889, -25.1705555556), + ("LPBG", 41.8683333333, -6.71194444444), + ("LPBJ", 38.0788888889, -7.93222222222), + ("LPBR", 41.5869444444, -8.445), + ("LPCO", 40.1572222222, -8.47), + ("LPCS", 38.725, -9.355), + ("LPCV", 40.2647222222, -7.47972222222), + ("LPEV", 38.5333333333, -7.88944444444), + ("LPFL", 39.455, -31.1311111111), + ("LPFR", 37.0141666667, -7.96583333333), + ("LPGR", 39.0919444444, -28.0297222222), + ("LPHR", 38.5197222222, -28.7158333333), + ("LPIN", 40.9741666667, -8.64527777778), + ("LPLA", 38.7641666667, -27.0933333333), + ("LPMG", 38.7166666667, -9.15583333333), + ("LPMR", 39.8311111111, -8.88722222222), + ("LPMT", 38.7036111111, -9.03583333333), + ("LPOV", 40.9158333333, -8.64583333333), + ("LPPD", 37.7411111111, -25.6977777778), + ("LPPI", 38.5544444444, -28.4397222222), + ("LPPM", 37.1491666667, -8.58388888889), + ("LPPR", 41.2480555556, -8.68138888889), + ("LPPS", 33.0733333333, -16.3497222222), + ("LPPT", 38.7811111111, -9.13583333333), + ("LPSJ", 38.6652777778, -28.1755555556), + ("LPST", 38.8308333333, -9.33944444444), + ("LPTN", 39.475, -8.36444444444), + ("LPVR", 41.2741666667, -7.72027777778), + ("LPVZ", 40.7252777778, -7.88888888889), + ("LQBK", 44.9413888889, 17.2975), + ("LQMO", 43.2827777778, 17.8458333333), + ("LQSA", 43.8244444444, 18.3313888889), + ("LRAR", 46.1763888889, 21.2619444444), + ("LRBC", 46.5219444444, 26.9102777778), + ("LRBM", 47.6583333333, 23.47), + ("LRBS", 44.5030555556, 26.1019444444), + ("LRCK", 44.3622222222, 28.4883333333), + ("LRCL", 46.785, 23.6861111111), + ("LRCS", 45.42, 22.2533333333), + ("LRCV", 44.3180555556, 23.8886111111), + ("LRIA", 47.1788888889, 27.62), + ("LROD", 47.0252777778, 21.9025), + ("LROP", 44.5736111111, 26.1033333333), + ("LRSB", 45.7855555556, 24.0911111111), + ("LRSM", 47.7033333333, 22.8855555556), + ("LRSV", 47.6875, 26.3538888889), + ("LRTC", 45.0622222222, 28.7141666667), + ("LRTM", 46.4675, 24.4125), + ("LRTR", 45.81, 21.3377777778), + ("LSAZ", 46.6136111111, 7.67777777778), + ("LSGC", 47.0836111111, 6.79277777778), + ("LSGG", 46.2380555556, 6.10888888889), + ("LSGK", 46.4875, 7.25083333333), + ("LSGS", 46.2194444444, 7.32666666667), + ("LSMA", 46.9438888889, 8.28416666667), + ("LSMC", 46.5011111111, 8.29555555556), + ("LSMD", 47.3986111111, 8.64805555556), + ("LSME", 47.0922222222, 8.305), + ("LSMF", 47.0786111111, 9.06472222222), + ("LSMI", 46.6763888889, 7.87916666667), + ("LSMJ", 46.3038888889, 7.71444444444), + ("LSMM", 46.7433333333, 8.11), + ("LSMN", 46.3036111111, 7.82333333333), + ("LSMP", 46.8430555556, 6.915), + ("LSMU", 46.9747222222, 8.39888888889), + ("LSSW", 47.3833333333, 8.56666666667), + ("LSZA", 46.0041666667, 8.91055555556), + ("LSZB", 46.9138888889, 7.49694444444), + ("LSZG", 47.1813888889, 7.41694444444), + ("LSZH", 47.4647222222, 8.54916666667), + ("LSZR", 47.485, 9.56055555556), + ("LSZS", 46.5325, 9.88277777778), + ("LTAA", 40.0, 32.0), + ("LTAB", 39.9347222222, 32.7405555556), + ("LTAC", 40.1280555556, 32.995), + ("LTAD", 39.9497222222, 32.6886111111), + ("LTAE", 40.0788888889, 32.5655555556), + ("LTAF", 36.9819444444, 35.2802777778), + ("LTAG", 37.0019444444, 35.4258333333), + ("LTAH", 38.7261111111, 30.6011111111), + ("LTAI", 36.9013888889, 30.7916666667), + ("LTAJ", 36.9480555556, 37.4791666667), + ("LTAK", 36.5733333333, 36.1538888889), + ("LTAL", 41.3138888889, 33.7958333333), + ("LTAN", 37.9788888889, 32.5616666667), + ("LTAP", 40.8291666667, 35.5219444444), + ("LTAQ", 41.2763888889, 36.3036111111), + ("LTAR", 39.8136111111, 36.9033333333), + ("LTAS", 41.5158333333, 32.0997222222), + ("LTAT", 38.4358333333, 38.0916666667), + ("LTAU", 38.7702777778, 35.4952777778), + ("LTAV", 39.4513888889, 31.3652777778), + ("LTAW", 40.305, 36.3677777778), + ("LTAX", 41.2544444444, 31.415), + ("LTAY", 37.785, 29.7011111111), + ("LTAZ", 38.7716666667, 34.5341666667), + ("LTBA", 40.9766666667, 28.8211111111), + ("LTBD", 37.8158333333, 27.8861111111), + ("LTBE", 40.2316666667, 29.0091666667), + ("LTBF", 39.6188888889, 27.9247222222), + ("LTBG", 40.3177777778, 27.9775), + ("LTBH", 40.1375, 26.4266666667), + ("LTBI", 39.7838888889, 30.5819444444), + ("LTBJ", 38.2922222222, 27.1569444444), + ("LTBK", 38.3191666667, 27.1597222222), + ("LTBL", 38.5130555556, 27.01), + ("LTBM", 37.7852777778, 30.5816666667), + ("LTBN", 39.4266666667, 30.0163888889), + ("LTBO", 38.6811111111, 29.4713888889), + ("LTBP", 40.6833333333, 29.3786111111), + ("LTBQ", 40.735, 30.0830555556), + ("LTBR", 40.255, 29.5625), + ("LTBS", 36.7130555556, 28.7925), + ("LTBT", 38.8086111111, 27.8336111111), + ("LTBU", 41.1380555556, 27.9188888889), + ("LTBX", 40.9927777778, 29.2163888889), + ("LTBY", 39.8097222222, 30.5194444444), + ("LTCA", 38.6066666667, 39.2913888889), + ("LTCC", 37.8936111111, 40.2005555556), + ("LTCD", 39.71, 39.5261111111), + ("LTCE", 39.9563888889, 41.17), + ("LTCF", 40.5622222222, 43.115), + ("LTCG", 40.995, 39.7897222222), + ("LTCH", 37.0919444444, 38.8461111111), + ("LTCI", 38.4680555556, 43.3322222222), + ("LTCJ", 37.9288888889, 41.1161111111), + ("LTCK", 38.7544444444, 41.6611111111), + ("LTCL", 37.9786111111, 41.8402777778), + ("LTCM", 42.0188888889, 35.0791666667), + ("LTFA", 38.5175, 26.9772222222), + ("LTFB", 37.9505555556, 27.3288888889), + ("LUBL", 47.8377777778, 27.7811111111), + ("LUKK", 46.9277777778, 28.9313888889), + ("LWOH", 41.1797222222, 20.7422222222), + ("LWSK", 41.9613888889, 21.6213888889), + ("LXGB", 36.1508333333, -5.34944444444), + ("LYBE", 44.8183333333, 20.3088888889), + ("LYPG", 42.3591666667, 19.2516666667), + ("LYPR", 42.5727777778, 21.0358333333), + ("LYTV", 42.4044444444, 18.7230555556), + ("LYVR", 45.1466666667, 21.3097222222), + ("LZIB", 48.17, 17.2125), + ("LZKZ", 48.6630555556, 21.2411111111), + ("LZMC", 48.4019444444, 17.1183333333), + ("LZPP", 48.625, 17.8283333333), + ("LZSL", 48.6377777778, 19.1338888889), + ("LZTN", 48.865, 17.9922222222), + ("LZTT", 49.0733333333, 20.2408333333), + ("LZZI", 49.2316666667, 18.6136111111), + ("MBNC", 21.9172222222, -71.9394444444), + ("MBPV", 21.7736111111, -72.2658333333), + ("MBSC", 21.5155555556, -71.5283333333), + ("MDAB", 19.1986111111, -69.43), + ("MDBH", 18.2513888889, -71.1202777778), + ("MDCR", 17.9288888889, -71.6447222222), + ("MDCZ", 18.9080555556, -70.72), + ("MDHE", 18.4711111111, -69.9688888889), + ("MDLR", 18.4519444444, -68.9116666667), + ("MDPC", 18.5672222222, -68.3633333333), + ("MDPP", 19.7572222222, -70.5697222222), + ("MDSD", 18.4294444444, -69.6686111111), + ("MDSI", 18.5036111111, -69.7616666667), + ("MDST", 19.4091666667, -70.6163888889), + ("MGBN", 15.4733333333, -88.8372222222), + ("MGCB", 15.4688888889, -90.4066666667), + ("MGGT", 14.5830555556, -90.5275), + ("MGPB", 15.7308333333, -88.5836111111), + ("MGPP", 16.3261111111, -89.4169444444), + ("MGQZ", 14.8652777778, -91.5019444444), + ("MGRT", 14.5208333333, -91.6972222222), + ("MGSJ", 13.9361111111, -90.8358333333), + ("MHIC", 17.4072222222, -83.9325), + ("MHLC", 15.7422222222, -86.8533333333), + ("MHLM", 15.4525, -87.9233333333), + ("MHNJ", 16.4452777778, -85.9063888889), + ("MHPL", 15.2608333333, -83.7813888889), + ("MHRO", 16.3166666667, -86.5225), + ("MHTE", 15.7758333333, -87.4755555556), + ("MHTG", 14.0608333333, -87.2169444444), + ("MHTJ", 15.9266666667, -85.9380555556), + ("MKBS", 18.4041666667, -76.9688888889), + ("MKJP", 17.9355555556, -76.7875), + ("MKJS", 18.5036111111, -77.9133333333), + ("MKKJ", 18.1986111111, -76.5344444444), + ("MKTP", 17.9883333333, -76.8236111111), + ("MMAA", 16.7566666667, -99.7533333333), + ("MMAN", 25.8655555556, -100.237222222), + ("MMAS", 21.7052777778, -102.317777778), + ("MMBT", 15.7747222222, -96.2608333333), + ("MMCB", 18.835, -99.2619444444), + ("MMCC", 29.3319444444, -100.980833333), + ("MMCE", 18.6536111111, -91.7988888889), + ("MMCG", 30.3972222222, -107.874722222), + ("MMCH", 17.5736111111, -99.5141666667), + ("MMCL", 24.7644444444, -107.474444444), + ("MMCM", 18.5044444444, -88.3266666667), + ("MMCN", 27.3925, -109.833055556), + ("MMCP", 19.8166666667, -90.5002777778), + ("MMCS", 31.6361111111, -106.428611111), + ("MMCU", 28.7027777778, -105.964444444), + ("MMCV", 23.7038888889, -98.9563888889), + ("MMCY", 20.5458333333, -100.886388889), + ("MMCZ", 20.5222222222, -86.9255555556), + ("MMDM", 22.7402777778, -99.0180555556), + ("MMDO", 24.1241666667, -104.527777778), + ("MMEP", 21.4194444444, -104.8425), + ("MMES", 31.7952777778, -116.6025), + ("MMGL", 20.5216666667, -103.311111111), + ("MMGM", 27.9688888889, -110.925), + ("MMHC", 18.4969444444, -97.4197222222), + ("MMHO", 29.0958333333, -111.047777778), + ("MMIA", 19.2769444444, -103.577222222), + ("MMIM", 21.245, -86.7397222222), + ("MMIO", 25.5494444444, -100.928611111), + ("MMIT", 16.4491666667, -95.0936111111), + ("MMJA", 19.475, -96.7975), + ("MMLC", 18.0016666667, -102.220277778), + ("MMLM", 25.685, -109.080555556), + ("MMLO", 20.9933333333, -101.480833333), + ("MMLP", 24.0725, -110.362222222), + ("MMLT", 25.9891666667, -111.348333333), + ("MMMA", 25.7697222222, -97.5252777778), + ("MMMD", 20.9369444444, -89.6575), + ("MMML", 32.6305555556, -115.241388889), + ("MMMM", 19.8497222222, -101.025277778), + ("MMMT", 18.1033333333, -94.5805555556), + ("MMMV", 26.9555555556, -101.47), + ("MMMX", 19.4361111111, -99.0719444444), + ("MMMY", 25.7783333333, -100.106666667), + ("MMMZ", 23.1611111111, -106.265833333), + ("MMNG", 31.2258333333, -110.975555556), + ("MMNL", 27.4438888889, -99.5702777778), + ("MMOX", 16.9997222222, -96.7263888889), + ("MMPA", 20.6025, -97.4608333333), + ("MMPB", 19.1580555556, -98.3713888889), + ("MMPC", 20.0772222222, -98.7822222222), + ("MMPE", 31.3516666667, -113.525555556), + ("MMPG", 28.6272222222, -100.535), + ("MMPN", 19.3966666667, -102.039166667), + ("MMPR", 20.68, -105.254166667), + ("MMPS", 15.8766666667, -97.0888888889), + ("MMQT", 20.6238888889, -100.368611111), + ("MMRX", 26.0088888889, -98.2283333333), + ("MMSD", 23.1516666667, -109.720833333), + ("MMSF", 30.93, -114.808611111), + ("MMSP", 22.2541666667, -100.930555556), + ("MMTA", 19.5363888889, -98.1733333333), + ("MMTC", 25.5680555556, -103.410555556), + ("MMTG", 16.7694444444, -93.3413888889), + ("MMTJ", 32.5408333333, -116.97), + ("MMTM", 22.2963888889, -97.8658333333), + ("MMTN", 22.0380555556, -98.8063888889), + ("MMTO", 19.3369444444, -99.5658333333), + ("MMTP", 14.7941666667, -92.37), + ("MMTX", 19.5983333333, -103.371944444), + ("MMUN", 21.0363888889, -86.8769444444), + ("MMVA", 17.9969444444, -92.8172222222), + ("MMVR", 19.1452777778, -96.1869444444), + ("MMZC", 22.8969444444, -102.686666667), + ("MMZH", 17.6013888889, -101.460277778), + ("MMZM", 20.045, -102.275833333), + ("MMZO", 19.1447222222, -104.558611111), + ("MMZP", 20.7558333333, -103.465277778), + ("MNBL", 11.9888888889, -83.7741666667), + ("MNBR", 12.1894444444, -86.3538888889), + ("MNLN", 12.4277777778, -86.9022222222), + ("MNMG", 12.1411111111, -86.1680555556), + ("MNPC", 14.0469444444, -83.3866666667), + ("MPBO", 9.34083333333, -82.2508333333), + ("MPCH", 9.45861111111, -82.5166666667), + ("MPDA", 8.39083333333, -82.4347222222), + ("MPHO", 8.91444444444, -79.5994444444), + ("MPJE", 7.51722222222, -78.1566666667), + ("MPLP", 8.40666666667, -78.1416666667), + ("MPMG", 8.97333333333, -79.5555555556), + ("MPSA", 8.08555555556, -80.945), + ("MPTO", 9.07111111111, -79.3833333333), + ("MRBA", 9.16694444444, -83.3325), + ("MRBC", 10.7686111111, -83.5858333333), + ("MRCC", 8.60111111111, -82.97), + ("MRCV", 10.3555555556, -85.8527777778), + ("MREC", 10.2019444444, -83.4719444444), + ("MRFI", 8.91611111111, -83.5072222222), + ("MRFS", 8.6525, -83.0652777778), + ("MRGF", 8.65388888889, -83.1819444444), + ("MRGP", 10.2172222222, -83.7947222222), + ("MRLB", 10.5930555556, -85.5441666667), + ("MRLC", 11.0352777778, -84.7061111111), + ("MRLM", 9.95777777778, -83.0219444444), + ("MRNS", 9.97638888889, -85.6527777778), + ("MROC", 9.99361111111, -84.2086111111), + ("MRPD", 9.73194444444, -82.9830555556), + ("MRPM", 8.95083333333, -83.4683333333), + ("MRPV", 9.95722222222, -84.1419444444), + ("MRQP", 9.44305555556, -84.1297222222), + ("MRSG", 10.2883333333, -83.7136111111), + ("MRSV", 8.82611111111, -82.9588888889), + ("MSLP", 13.4405555556, -89.0558333333), + ("MSSS", 13.7, -89.12), + ("MTCH", 19.7325, -72.1947222222), + ("MTPP", 18.58, -72.2925), + ("MUBA", 20.3655555556, -74.5063888889), + ("MUBY", 20.3963888889, -76.6213888889), + ("MUCA", 22.0269444444, -78.7894444444), + ("MUCB", 22.5063888889, -79.4697222222), + ("MUCC", 22.4611111111, -78.3286111111), + ("MUCF", 22.15, -80.4141666667), + ("MUCL", 21.6161111111, -81.5455555556), + ("MUCM", 21.4202777778, -77.8475), + ("MUCU", 19.97, -75.8355555556), + ("MUFL", 21.4997222222, -78.2027777778), + ("MUGM", 19.9063888889, -75.2069444444), + ("MUGT", 20.0852777778, -75.1583333333), + ("MUHA", 22.9891666667, -82.4091666667), + ("MUHG", 20.7855555556, -76.315), + ("MULM", 22.3358333333, -83.6419444444), + ("MUMG", 22.9697222222, -82.2747222222), + ("MUML", 23.0072222222, -82.7675), + ("MUMO", 20.6541666667, -74.9216666667), + ("MUMZ", 20.2880555556, -77.0891666667), + ("MUNC", 20.6886111111, -75.5313888889), + ("MUNG", 21.8347222222, -82.7838888889), + ("MUPB", 23.0327777778, -82.5794444444), + ("MUPR", 22.4211111111, -83.6775), + ("MUSA", 22.8713888889, -82.5091666667), + ("MUSC", 22.4919444444, -79.9436111111), + ("MUSJ", 22.0952777778, -84.1519444444), + ("MUSL", 21.5094444444, -77.0175), + ("MUSN", 21.6425, -82.955), + ("MUSS", 21.9705555556, -79.4422222222), + ("MUTD", 21.7883333333, -79.9972222222), + ("MUVR", 23.0344444444, -81.4352777778), + ("MUVT", 20.9877777778, -76.9358333333), + ("MWCB", 19.6866666667, -79.8827777778), + ("MWCR", 19.2927777778, -81.3575), + ("MYAB", 24.2875, -77.6844444444), + ("MYAF", 24.6977777778, -77.7955555556), + ("MYAK", 24.1586111111, -77.5897222222), + ("MYAM", 26.5113888889, -77.0833333333), + ("MYAN", 25.0536111111, -78.0488888889), + ("MYAP", 22.4416666667, -73.9708333333), + ("MYAS", 26.0044444444, -77.3952777778), + ("MYAT", 26.7452777778, -77.3911111111), + ("MYBC", 25.4169444444, -77.8808333333), + ("MYBG", 25.7380555556, -77.84), + ("MYBS", 25.6997222222, -79.2644444444), + ("MYCA", 24.6291666667, -75.6736111111), + ("MYCB", 24.315, -75.4538888889), + ("MYCI", 22.7455555556, -74.1822222222), + ("MYEF", 23.5625, -75.8777777778), + ("MYEH", 25.4755555556, -76.6811111111), + ("MYEM", 25.2844444444, -76.3308333333), + ("MYEN", 24.5944444444, -76.8319444444), + ("MYER", 24.8916666667, -76.1775), + ("MYES", 24.1688888889, -76.4388888889), + ("MYGF", 26.5586111111, -78.6952777778), + ("MYGW", 26.6861111111, -78.9775), + ("MYIG", 20.975, -73.6666666667), + ("MYLD", 23.1788888889, -75.0933333333), + ("MYLS", 23.5827777778, -75.2686111111), + ("MYMM", 22.3794444444, -73.0133333333), + ("MYNN", 25.0388888889, -77.4661111111), + ("MYRD", 22.1816666667, -75.7294444444), + ("MYSM", 24.0630555556, -74.5238888889), + ("MZBZ", 17.5388888889, -88.3080555556), + ("NCAI", -18.825, -159.773611111), + ("NCRG", -21.2025, -159.805555556), + ("NFFN", -17.7544444444, 177.443333333), + ("NFNA", -18.0430555556, 178.559166667), + ("NFNL", -16.4666666667, 179.339722222), + ("NFTF", -21.2408333333, -175.15), + ("NFTL", -19.7769444444, -174.341111111), + ("NFTV", -18.5852777778, -173.962777778), + ("NGFU", -8.51666666667, 179.216666667), + ("NGTA", 1.38138888889, 173.146944444), + ("NGTE", -1.22361111111, 174.776111111), + ("NIUE", -19.08, -169.925555556), + ("NLWW", -13.2380555556, -176.199166667), + ("NSFA", -13.8297222222, -172.008333333), + ("NSTU", -14.3308333333, -170.710277778), + ("NTAR", -22.4338888889, -151.360555556), + ("NTAT", -23.3652777778, -149.523888889), + ("NTGA", -17.3525, -145.509722222), + ("NTGB", -15.8197222222, -140.886944444), + ("NTGC", -15.1194444444, -148.230555556), + ("NTGE", -18.4658333333, -136.439444444), + ("NTGF", -16.0544444444, -145.656944444), + ("NTGI", -14.4366666667, -146.07), + ("NTGJ", -23.0797222222, -134.890277778), + ("NTGK", -15.6633333333, -146.884722222), + ("NTGM", -16.5847222222, -143.657222222), + ("NTGN", -14.1766666667, -141.267222222), + ("NTGP", -14.8094444444, -138.812777778), + ("NTGT", -14.7125, -145.252777778), + ("NTGU", -15.2480555556, -146.616388889), + ("NTGV", -14.8680555556, -148.717222222), + ("NTGY", -20.7833333333, -138.567777778), + ("NTKR", -14.4555555556, -145.024444444), + ("NTMD", -8.79555555556, -140.228611111), + ("NTMN", -9.76861111111, -139.011111111), + ("NTTB", -16.4441666667, -151.751111111), + ("NTTG", -14.9541666667, -147.660555556), + ("NTTH", -16.6872222222, -151.021666667), + ("NTTM", -17.4897222222, -149.761666667), + ("NTTO", -18.0747222222, -140.945833333), + ("NTTP", -16.4263888889, -152.243611111), + ("NTTR", -16.7227777778, -151.465833333), + ("NTTX", -21.8083333333, -138.794166667), + ("NVSS", -15.5011111111, 167.2225), + ("NVVV", -17.6991666667, 168.319722222), + ("NWWD", -21.0533333333, 164.837777778), + ("NWWK", -20.5461111111, 164.255555556), + ("NWWL", -20.7747222222, 167.239722222), + ("NWWM", -22.2580555556, 166.472777778), + ("NWWR", -21.4816666667, 168.0375), + ("NWWU", -20.7911111111, 165.259166667), + ("NWWV", -20.6405555556, 166.572777778), + ("NWWW", -22.0144444444, 166.212777778), + ("NZAA", -37.0080555556, 174.791666667), + ("NZAP", -38.7397222222, 176.084444444), + ("NZAR", -37.0297222222, 174.973333333), + ("NZCH", -43.4891666667, 172.532222222), + ("NZCI", -43.81, -176.457222222), + ("NZDN", -45.9280555556, 170.198333333), + ("NZGS", -38.6633333333, 177.978333333), + ("NZGT", -43.9066666667, 170.128333333), + ("NZHK", -42.7136111111, 170.985277778), + ("NZHN", -37.8663888889, 175.331944444), + ("NZHS", -39.6466666667, 176.766944444), + ("NZKK", -35.2627777778, 173.911944444), + ("NZKT", -35.07, 173.285277778), + ("NZLX", -45.2116666667, 169.373333333), + ("NZMC", -43.765, 170.133333333), + ("NZMO", -45.5330555556, 167.65), + ("NZMS", -40.9733333333, 175.633611111), + ("NZNP", -39.0086111111, 174.179166667), + ("NZNS", -41.2983333333, 173.221111111), + ("NZNV", -46.4122222222, 168.312777778), + ("NZOH", -40.2058333333, 175.387777778), + ("NZOU", -44.97, 171.081666667), + ("NZPM", -40.3205555556, 175.616944444), + ("NZPP", -40.9047222222, 174.989166667), + ("NZQN", -45.0211111111, 168.739166667), + ("NZRO", -38.1091666667, 176.317222222), + ("NZRU", -39.4463888889, 175.658333333), + ("NZSP", -89.9997222222, 0.0), + ("NZTG", -37.6719444444, 176.196111111), + ("NZTU", -44.3027777778, 171.225277778), + ("NZUK", -44.235, 170.118333333), + ("NZWB", -41.5183333333, 173.870277778), + ("NZWD", -77.8833333333, 166.65), + ("NZWF", -44.7252777778, 169.243055556), + ("NZWG", -43.5511111111, 172.552777778), + ("NZWK", -37.9205555556, 176.914166667), + ("NZWN", -41.3272222222, 174.805277778), + ("NZWO", -39.0069444444, 177.406666667), + ("NZWP", -36.7877777778, 174.630277778), + ("NZWR", -35.7683333333, 174.365), + ("NZWS", -41.7380555556, 171.580833333), + ("NZWU", -39.9622222222, 175.025277778), + ("OAHR", 34.2097222222, 62.2277777778), + ("OAJL", 34.3991666667, 70.4994444444), + ("OAKB", 34.5658333333, 69.2122222222), + ("OAKN", 31.5058333333, 65.8477777778), + ("OAMN", 35.9341666667, 64.7591666667), + ("OAMS", 36.7069444444, 67.2091666667), + ("OASD", 33.3911111111, 62.2608333333), + ("OASG", 36.7502777778, 65.9122222222), + ("OATQ", 36.775, 69.5325), + ("OAUZ", 36.665, 68.9108333333), + ("OBBI", 26.2708333333, 50.6336111111), + ("OBBS", 25.9183333333, 50.5905555556), + ("OEAB", 18.24, 42.6555555556), + ("OEAH", 25.2841666667, 49.4861111111), + ("OEBA", 20.2961111111, 41.6341666667), + ("OEBH", 19.9838888889, 42.6227777778), + ("OEBQ", 25.9113888889, 49.5913888889), + ("OEDF", 26.4711111111, 49.7977777778), + ("OEDR", 26.2652777778, 50.1519444444), + ("OEGN", 16.9011111111, 42.5858333333), + ("OEGS", 26.3027777778, 43.7744444444), + ("OEGT", 31.4108333333, 37.2788888889), + ("OEHL", 27.4377777778, 41.6861111111), + ("OEJB", 27.0388888889, 49.405), + ("OEJF", 21.3480555556, 39.1727777778), + ("OEJN", 21.6794444444, 39.1563888889), + ("OEKK", 27.9008333333, 45.5280555556), + ("OEMA", 24.5533333333, 39.705), + ("OENG", 17.6113888889, 44.4191666667), + ("OEPA", 28.335, 46.125), + ("OEPC", 25.1744444444, 47.4883333333), + ("OEPF", 24.7102777778, 44.9644444444), + ("OEPJ", 24.1072222222, 41.0358333333), + ("OERB", 22.7025, 39.0697222222), + ("OERF", 29.6263888889, 43.4905555556), + ("OERK", 24.9575, 46.6986111111), + ("OERM", 28.0794444444, 48.6108333333), + ("OERR", 30.9072222222, 41.1383333333), + ("OERT", 26.7230555556, 50.0305555556), + ("OESH", 17.4666666667, 47.1211111111), + ("OESK", 29.785, 40.1), + ("OESL", 20.4647222222, 45.6194444444), + ("OETB", 28.3652777778, 36.6188888889), + ("OETF", 21.4833333333, 40.5441666667), + ("OETH", 25.2141666667, 46.6405555556), + ("OETN", 27.8688888889, 48.7683333333), + ("OETR", 31.6925, 38.7311111111), + ("OEWD", 20.5041666667, 45.1994444444), + ("OEWJ", 26.1975, 36.4761111111), + ("OEYN", 24.1441666667, 38.0633333333), + ("OIAA", 30.365, 48.2330555556), + ("OIAD", 32.4344444444, 48.3975), + ("OIAG", 30.7452777778, 49.6761111111), + ("OIAH", 30.3375, 50.8277777778), + ("OIAI", 32.0022222222, 49.2705555556), + ("OIAJ", 30.835, 49.5347222222), + ("OIAM", 30.5561111111, 49.1516666667), + ("OIAW", 31.3372222222, 48.7619444444), + ("OIBA", 25.8758333333, 55.0327777778), + ("OIBB", 28.9447222222, 50.8344444444), + ("OIBH", 27.2125, 54.3183333333), + ("OIBI", 27.4838888889, 52.6183333333), + ("OIBK", 26.5266666667, 53.9816666667), + ("OIBL", 26.5316666667, 54.8216666667), + ("OIBQ", 29.2591666667, 50.3238888889), + ("OIBS", 25.9094444444, 54.5391666667), + ("OIBV", 26.81, 53.3563888889), + ("OICC", 34.3463888889, 47.1563888889), + ("OICD", 32.9344444444, 47.4833333333), + ("OICI", 33.5855555556, 46.4052777778), + ("OICK", 33.4363888889, 48.2858333333), + ("OICS", 35.2469444444, 47.0069444444), + ("OIFE", 32.9294444444, 51.5608333333), + ("OIFH", 32.5669444444, 51.6913888889), + ("OIFM", 32.7505555556, 51.8616666667), + ("OIFP", 32.6208333333, 51.6966666667), + ("OIGG", 37.3252777778, 49.6055555556), + ("OIHH", 34.8680555556, 48.5522222222), + ("OIHR", 34.1402777778, 49.8483333333), + ("OIID", 35.7027777778, 51.475), + ("OIIG", 35.6447222222, 51.3805555556), + ("OIII", 35.6891666667, 51.3133333333), + ("OIIK", 36.2413888889, 50.0475), + ("OIIS", 35.5908333333, 53.495), + ("OIKB", 27.2180555556, 56.3777777778), + ("OIKJ", 28.7266666667, 57.67), + ("OIKK", 30.2611111111, 56.9566666667), + ("OIKM", 29.0838888889, 58.4502777778), + ("OIKP", 27.1580555556, 56.1722222222), + ("OIKQ", 26.755, 55.9019444444), + ("OIKR", 30.2977777778, 56.0519444444), + ("OIKY", 29.5508333333, 55.6725), + ("OIMB", 32.8955555556, 59.2755555556), + ("OIMC", 36.5011111111, 61.0647222222), + ("OIMJ", 36.4236111111, 55.1058333333), + ("OIMN", 37.4930555556, 57.3005555556), + ("OIMT", 33.6677777778, 56.8925), + ("OIMX", 37.6277777778, 56.1730555556), + ("OINE", 37.3830555556, 55.4519444444), + ("OING", 36.9091666667, 54.4016666667), + ("OINM", 34.1691666667, 51.3175), + ("OINN", 36.6633333333, 51.4647222222), + ("OINR", 36.9097222222, 50.6794444444), + ("OINZ", 36.6436111111, 53.1883333333), + ("OISD", 28.7213888889, 54.4411111111), + ("OISF", 28.8919444444, 53.7227777778), + ("OISJ", 28.5863888889, 53.5788888889), + ("OISL", 27.6736111111, 54.3813888889), + ("OISO", 29.7541666667, 52.6941666667), + ("OISR", 27.3708333333, 53.1891666667), + ("OISS", 29.5391666667, 52.5894444444), + ("OITL", 38.3261111111, 48.4241666667), + ("OITM", 37.3486111111, 46.1261111111), + ("OITP", 39.6036111111, 47.8811111111), + ("OITT", 38.1327777778, 46.2347222222), + ("OITZ", 36.7741666667, 48.3597222222), + ("OIYY", 31.9047222222, 54.2763888889), + ("OIZB", 31.0969444444, 61.5438888889), + ("OIZC", 25.4433333333, 60.3819444444), + ("OIZH", 29.4761111111, 60.9058333333), + ("OIZI", 27.2363888889, 60.72), + ("OIZJ", 25.6533333333, 57.7991666667), + ("OJAI", 31.7225, 35.9930555556), + ("OJAM", 31.9725, 35.9913888889), + ("OJAQ", 29.6113888889, 35.0180555556), + ("OJJR", 31.8647222222, 35.2191666667), + ("OJMF", 32.3561111111, 36.2591666667), + ("OKBK", 29.2266666667, 47.98), + ("OLBA", 33.8133333333, 35.4886111111), + ("OLKA", 34.5891666667, 36.0111111111), + ("OMAA", 24.4327777778, 54.6511111111), + ("OMAD", 24.4283333333, 54.4580555556), + ("OMAH", 24.0736111111, 52.4633333333), + ("OMAJ", 24.1872222222, 52.6138888889), + ("OMAL", 24.2616666667, 55.6091666667), + ("OMAM", 24.2480555556, 54.5475), + ("OMAR", 24.7802777778, 52.5597222222), + ("OMAS", 25.1461111111, 52.8736111111), + ("OMAZ", 24.8613888889, 53.0777777778), + ("OMDB", 25.2547222222, 55.3641666667), + ("OMFJ", 25.1122222222, 56.3238888889), + ("OMRK", 25.6133333333, 55.9386111111), + ("OMSJ", 25.3283333333, 55.5169444444), + ("OOKB", 26.1711111111, 56.2405555556), + ("OOMA", 20.6752777778, 58.8902777778), + ("OOMS", 23.5930555556, 58.2844444444), + ("OOSA", 17.0386111111, 54.0911111111), + ("OOSQ", 23.0666666667, 57.65), + ("OOTH", 17.6658333333, 54.0244444444), + ("OPBN", 32.9719444444, 70.5247222222), + ("OPBW", 29.3469444444, 71.7113888889), + ("OPCH", 35.8863888889, 71.8005555556), + ("OPDB", 28.8747222222, 64.4044444444), + ("OPDG", 29.9611111111, 70.4855555556), + ("OPDI", 31.9091666667, 70.8963888889), + ("OPFA", 31.365, 72.9952777778), + ("OPGD", 25.2330555556, 62.3294444444), + ("OPGT", 35.9186111111, 74.3336111111), + ("OPJA", 28.2841666667, 68.4494444444), + ("OPJI", 25.0677777778, 61.8052777778), + ("OPKC", 24.9063888889, 67.1605555556), + ("OPKD", 25.3180555556, 68.3661111111), + ("OPKH", 27.7925, 66.6427777778), + ("OPKN", 28.5944444444, 65.4247222222), + ("OPLA", 31.5213888889, 74.4033333333), + ("OPLH", 31.4947222222, 74.3461111111), + ("OPMA", 33.05, 73.6383333333), + ("OPMF", 34.3383333333, 73.5083333333), + ("OPMI", 32.5630555556, 71.5705555556), + ("OPMJ", 27.335, 68.1427777778), + ("OPMK", 25.6825, 69.0727777778), + ("OPMN", 33.0125, 70.0641666667), + ("OPMR", 24.8933333333, 66.9386111111), + ("OPMT", 30.2030555556, 71.4188888889), + ("OPNH", 26.2191666667, 68.39), + ("OPNK", 29.5377777778, 66.0222222222), + ("OPOK", 30.7408333333, 73.3575), + ("OPOR", 25.2730555556, 64.5883333333), + ("OPPC", 33.9025, 70.0713888889), + ("OPPG", 26.9544444444, 64.1325), + ("OPPI", 25.2836111111, 63.3327777778), + ("OPPS", 33.9938888889, 71.5144444444), + ("OPQS", 33.5611111111, 73.0319444444), + ("OPQT", 30.2511111111, 66.9375), + ("OPRK", 28.3852777778, 70.2797222222), + ("OPRN", 33.6163888889, 73.0991666667), + ("OPRQ", 30.7580555556, 72.2825), + ("OPRS", 34.0811111111, 71.9725), + ("OPRT", 33.8491666667, 73.7977777778), + ("OPSD", 35.3347222222, 75.5363888889), + ("OPSK", 27.7219444444, 68.7916666667), + ("OPSR", 32.0486111111, 72.665), + ("OPSS", 34.8130555556, 72.3519444444), + ("OPSU", 28.645, 69.1766666667), + ("OPSW", 31.8894444444, 72.3091666667), + ("OPTA", 33.9861111111, 72.6113888889), + ("OPTH", 24.8413888889, 68.8383333333), + ("OPTU", 25.9861111111, 63.03), + ("OPWN", 32.3052777778, 69.5694444444), + ("OPZB", 31.3583333333, 69.4633333333), + ("ORBS", 33.2619444444, 44.2338888889), + ("ORMM", 30.5486111111, 47.6622222222), + ("OSAP", 36.1805555556, 37.2241666667), + ("OSDI", 33.4113888889, 36.5155555556), + ("OSDZ", 35.2852777778, 40.1758333333), + ("OSKL", 37.0236111111, 41.1944444444), + ("OSLK", 35.4008333333, 35.9486111111), + ("OSPR", 34.5572222222, 38.3166666667), + ("OTBD", 25.2611111111, 51.565), + ("PAAQ", 61.5947222222, -149.088611111), + ("PABA", 70.1338888889, -143.576944444), + ("PABE", 60.7797222222, -161.837777778), + ("PABI", 63.9944444444, -145.721388889), + ("PABM", 59.3616666667, -155.257222222), + ("PABR", 71.2852777778, -156.765833333), + ("PABT", 66.9152777778, -151.528055556), + ("PACD", 55.2055555556, -162.724166667), + ("PACL", 64.3011111111, -149.12), + ("PACV", 60.4916666667, -145.4775), + ("PACZ", 61.7802777778, -166.038611111), + ("PADK", 51.8777777778, -176.645833333), + ("PADL", 59.0452777778, -158.503333333), + ("PADQ", 57.75, -152.493611111), + ("PADU", 53.9, -166.543333333), + ("PAED", 61.2511111111, -149.806388889), + ("PAEH", 58.6472222222, -162.060555556), + ("PAEI", 64.6655555556, -147.101388889), + ("PAEN", 60.5730555556, -151.245), + ("PAFA", 64.815, -147.856111111), + ("PAFB", 64.8375, -147.614444444), + ("PAFR", 61.2661111111, -149.653055556), + ("PAGA", 64.7361111111, -156.937222222), + ("PAGK", 62.1547222222, -145.456388889), + ("PAGY", 59.46, -135.315555556), + ("PAHO", 59.6455555556, -151.476388889), + ("PAIL", 59.7536111111, -154.910833333), + ("PAIM", 65.9927777778, -153.704166667), + ("PAJN", 58.3547222222, -134.576111111), + ("PAKN", 58.6766666667, -156.649166667), + ("PAKT", 55.3555555556, -131.713611111), + ("PALU", 68.875, -166.11), + ("PAMC", 62.9527777778, -155.605555556), + ("PAMD", 59.4497222222, -146.308611111), + ("PAMR", 61.2141666667, -149.846111111), + ("PANC", 61.1741666667, -149.996111111), + ("PANT", 55.0422222222, -131.572222222), + ("PAOM", 64.5119444444, -165.445), + ("PAOR", 62.9611111111, -141.928888889), + ("PAOT", 66.8844444444, -162.598333333), + ("PAPB", 56.5783333333, -169.661388889), + ("PAPM", 59.0111111111, -161.819444444), + ("PASC", 70.1947222222, -148.465), + ("PASI", 57.0469444444, -135.361388889), + ("PASN", 57.1672222222, -170.220277778), + ("PASV", 61.0972222222, -155.574166667), + ("PASY", 52.7122222222, 174.113611111), + ("PATA", 65.1741666667, -152.109166667), + ("PATC", 65.5630555556, -167.922222222), + ("PATK", 62.3202777778, -150.093611111), + ("PATL", 62.8941666667, -155.976388889), + ("PAUN", 63.8883333333, -160.798888889), + ("PAVD", 61.1338888889, -146.248333333), + ("PAWT", 70.6133333333, -159.860277778), + ("PAYA", 59.5030555556, -139.66), + ("PCIS", -2.76666666667, -0.0), + ("PFYU", 66.5713888889, -145.250277778), + ("PGRO", 14.1744444444, 145.243333333), + ("PGSN", 15.1194444444, 145.729166667), + ("PGTW", 13.5, 144.833333333), + ("PGUA", 13.5838888889, 144.93), + ("PGUM", 13.4838888889, 144.796944444), + ("PGWT", 14.9977777778, 145.619166667), + ("PHBK", 22.0216666667, -159.786666667), + ("PHDH", 21.5791666667, -158.210277778), + ("PHHI", 21.4833333333, -158.039444444), + ("PHHN", 20.7955555556, -156.014166667), + ("PHJH", 20.9627777778, -156.674166667), + ("PHKO", 19.7386111111, -156.045555556), + ("PHLI", 21.9761111111, -159.338611111), + ("PHMK", 21.1527777778, -157.096111111), + ("PHMU", 20.0011111111, -155.668055556), + ("PHNG", 21.4491666667, -157.767777778), + ("PHNL", 21.3158333333, -157.926666667), + ("PHNY", 20.7855555556, -156.951388889), + ("PHOG", 20.8986111111, -156.430555556), + ("PHSF", 19.76, -155.553611111), + ("PHTO", 19.7202777778, -155.048611111), + ("PHUP", 20.265, -155.859722222), + ("PJON", 16.7286111111, -169.534166667), + ("PKMA", 11.3408333333, 162.327777778), + ("PKMJ", 7.06472222222, 171.271944444), + ("PKRO", 9.39666666667, 167.470833333), + ("PKWA", 8.72, 167.731388889), + ("PLCH", 1.98611111111, -157.349722222), + ("PMDY", 28.2013888889, -177.381388889), + ("POLI", 70.4994444444, -149.879444444), + ("PPIZ", 69.7327777778, -163.005277778), + ("PTKK", 7.46166666667, 151.842777778), + ("PTPN", 6.985, 158.208888889), + ("PTRO", 7.3675, 134.543888889), + ("PTSA", 5.35666666667, 162.958333333), + ("PTYA", 9.49861111111, 138.082222222), + ("RCBS", 24.4319444444, 118.359444444), + ("RCDC", 22.6722222222, 120.461666667), + ("RCDI", 24.855, 121.2375), + ("RCFN", 22.7566666667, 121.093333333), + ("RCGI", 22.6744444444, 121.458333333), + ("RCGM", 25.0555555556, 121.2425), + ("RCKH", 22.5752777778, 120.350833333), + ("RCKU", 23.4616666667, 120.392777778), + ("RCLG", 24.1861111111, 120.653611111), + ("RCLY", 22.0294444444, 121.527222222), + ("RCMQ", 24.2644444444, 120.620555556), + ("RCMT", 26.2238888889, 120.0025), + ("RCNN", 22.9502777778, 120.205555556), + ("RCPO", 24.8177777778, 120.939166667), + ("RCQC", 23.5686111111, 119.628055556), + ("RCQS", 22.7930555556, 121.181944444), + ("RCRA", 22.7047222222, 120.280555556), + ("RCSQ", 22.7, 120.482222222), + ("RCSS", 25.0694444444, 121.551666667), + ("RCTP", 25.08, 121.232222222), + ("RCWA", 23.3708333333, 119.494444444), + ("RCYU", 24.0230555556, 121.617777778), + ("RJAA", 35.7647222222, 140.386388889), + ("RJAF", 36.1666666667, 137.922777778), + ("RJAH", 36.1808333333, 140.415277778), + ("RJAM", 24.2894444444, 153.978888889), + ("RJAW", 24.7838888889, 141.3225), + ("RJBD", 33.6622222222, 135.364444444), + ("RJBK", 34.5908333333, 133.933055556), + ("RJCB", 42.7333333333, 143.217222222), + ("RJCC", 42.775, 141.692222222), + ("RJCH", 41.77, 140.821944444), + ("RJCJ", 42.7944444444, 141.666388889), + ("RJCM", 43.8805555556, 144.163888889), + ("RJCN", 43.5772222222, 144.959722222), + ("RJCO", 43.1161111111, 141.38), + ("RJCT", 42.8902777778, 143.158333333), + ("RJCW", 45.4038888889, 141.800833333), + ("RJDB", 33.7488888889, 129.785277778), + ("RJDC", 33.93, 131.278888889), + ("RJDT", 34.2847222222, 129.330277778), + ("RJEB", 44.3038888889, 143.403888889), + ("RJEC", 43.6708333333, 142.4475), + ("RJER", 45.2419444444, 141.186388889), + ("RJFA", 33.8830555556, 130.652777778), + ("RJFC", 30.3855555556, 130.658888889), + ("RJFE", 32.6661111111, 128.832777778), + ("RJFF", 33.5863888889, 130.45), + ("RJFG", 30.5466666667, 130.95), + ("RJFK", 31.8033333333, 130.719166667), + ("RJFM", 31.8769444444, 131.448333333), + ("RJFN", 32.0836111111, 131.451666667), + ("RJFO", 33.4794444444, 131.737222222), + ("RJFR", 33.8361111111, 130.946944444), + ("RJFT", 32.8372222222, 130.855), + ("RJFU", 32.9225, 129.923333333), + ("RJFY", 31.3675, 130.845277778), + ("RJFZ", 33.6852777778, 131.040555556), + ("RJKA", 28.4305555556, 129.7125), + ("RJKB", 27.4252777778, 128.700833333), + ("RJKN", 27.8361111111, 128.881111111), + ("RJNF", 36.1427777778, 136.223888889), + ("RJNG", 35.3941666667, 136.869444444), + ("RJNH", 34.75, 137.703055556), + ("RJNK", 36.3936111111, 136.407777778), + ("RJNN", 35.255, 136.924444444), + ("RJNO", 36.1811111111, 133.324722222), + ("RJNT", 36.6483333333, 137.187222222), + ("RJNY", 34.8125, 138.297777778), + ("RJOA", 34.4352777778, 132.921944444), + ("RJOB", 34.7569444444, 133.855555556), + ("RJOC", 35.4136111111, 132.89), + ("RJOF", 34.0344444444, 131.549166667), + ("RJOH", 35.4922222222, 133.236388889), + ("RJOI", 34.1436111111, 132.235555556), + ("RJOK", 33.5444444444, 133.671388889), + ("RJOM", 33.8272222222, 132.699722222), + ("RJOO", 34.7852777778, 135.438055556), + ("RJOR", 35.53, 134.166388889), + ("RJOS", 34.1327777778, 134.606388889), + ("RJOT", 34.2138888889, 134.015555556), + ("RJOY", 34.5961111111, 135.602777778), + ("RJOZ", 34.0452777778, 131.051944444), + ("RJSA", 40.7344444444, 140.690833333), + ("RJSC", 38.4116666667, 140.371111111), + ("RJSH", 40.5563888889, 141.466111111), + ("RJSI", 39.4308333333, 141.135833333), + ("RJSK", 39.6155555556, 140.218611111), + ("RJSM", 40.7030555556, 141.368333333), + ("RJSS", 38.1394444444, 140.916666667), + ("RJST", 38.4047222222, 141.219444444), + ("RJSY", 38.8116666667, 139.786944444), + ("RJTA", 35.4544444444, 139.45), + ("RJTE", 34.9869444444, 139.829166667), + ("RJTF", 35.6716666667, 139.528055556), + ("RJTH", 33.115, 139.785555556), + ("RJTJ", 35.8413888889, 139.409722222), + ("RJTK", 35.3980555556, 139.909722222), + ("RJTL", 35.7988888889, 140.011111111), + ("RJTO", 34.7844444444, 139.361388889), + ("RJTQ", 34.0719444444, 139.559722222), + ("RJTR", 35.5136111111, 139.393611111), + ("RJTT", 35.5522222222, 139.779444444), + ("RJTY", 35.7483333333, 139.348333333), + ("RKJJ", 35.1255555556, 126.809722222), + ("RKJK", 35.9036111111, 126.615833333), + ("RKJM", 34.7588888889, 126.379722222), + ("RKJU", 35.8783333333, 127.119444444), + ("RKJY", 34.8397222222, 127.615277778), + ("RKNC", 37.8836111111, 127.717777778), + ("RKND", 38.1475, 128.600555556), + ("RKNN", 37.7533333333, 128.943888889), + ("RKNW", 37.4380555556, 127.960277778), + ("RKNY", 38.0611111111, 128.668888889), + ("RKPC", 33.5111111111, 126.492777778), + ("RKPE", 35.1411111111, 128.695555556), + ("RKPK", 35.1794444444, 128.938055556), + ("RKPP", 35.1708333333, 129.128611111), + ("RKPS", 35.0883333333, 128.070277778), + ("RKPU", 35.5933333333, 129.351666667), + ("RKSG", 36.9605555556, 127.033333333), + ("RKSM", 37.4458333333, 127.113888889), + ("RKSO", 37.0905555556, 127.029444444), + ("RKSS", 37.5580555556, 126.790555556), + ("RKSW", 37.2391666667, 127.006944444), + ("RKTH", 35.9877777778, 129.420277778), + ("RKTJ", 35.8563888889, 129.211388889), + ("RKTN", 35.8938888889, 128.658611111), + ("RKTU", 36.7163888889, 127.498888889), + ("RKTY", 36.6316666667, 128.354722222), + ("ROAH", 26.1955555556, 127.645833333), + ("RODE", 26.7286111111, 127.761666667), + ("RODN", 26.3555555556, 127.7675), + ("ROIG", 24.3444444444, 124.186944444), + ("ROKJ", 26.3633333333, 126.713611111), + ("ROMD", 25.8463888889, 131.263333333), + ("ROMY", 24.7827777778, 125.295), + ("RORK", 25.9477777778, 131.321388889), + ("RORS", 24.8266666667, 125.144722222), + ("RORY", 27.0438888889, 128.401388889), + ("ROTM", 26.2741666667, 127.756388889), + ("ROYN", 24.4669444444, 122.977777778), + ("RPLL", 14.5086111111, 121.019444444), + ("RPMB", 6.10555555556, 125.236111111), + ("RPMC", 7.16472222222, 124.210277778), + ("RPML", 8.41444444444, 124.611388889), + ("RPMM", 7.61722222222, 124.058611111), + ("RPMP", 7.82777777778, 123.460277778), + ("RPMR", 6.05805555556, 125.096111111), + ("RPMS", 9.75777777778, 125.480833333), + ("RPMZ", 6.92222222222, 122.059444444), + ("RPUB", 16.375, 120.618888889), + ("RPUD", 14.1291666667, 122.980277778), + ("RPUF", 14.9863888889, 120.4925), + ("RPUG", 16.0347222222, 120.240833333), + ("RPUH", 12.3613888889, 121.046388889), + ("RPUI", 15.3255555556, 119.968888889), + ("RPUL", 13.955, 121.124722222), + ("RPUM", 13.2080555556, 120.605277778), + ("RPUN", 13.5852777778, 123.270833333), + ("RPUO", 20.4516666667, 121.98), + ("RPUP", 14.2927777778, 122.645555556), + ("RPUQ", 17.5536111111, 120.3575), + ("RPUS", 16.5955555556, 120.303055556), + ("RPUT", 17.6380555556, 121.730555556), + ("RPUV", 13.5775, 124.206111111), + ("RPUW", 13.3611111111, 121.825277778), + ("RPUY", 16.9297222222, 121.753333333), + ("RPUZ", 16.6188888889, 121.252222222), + ("RPVA", 11.2272222222, 125.027777778), + ("RPVB", 10.6425, 122.929444444), + ("RPVC", 12.0725, 124.545), + ("RPVD", 9.33416666667, 123.301944444), + ("RPVF", 12.5022222222, 124.635555556), + ("RPVG", 11.0355555556, 125.742777778), + ("RPVI", 10.7130555556, 122.545), + ("RPVK", 11.6811111111, 122.377777778), + ("RPVM", 10.3075, 123.979166667), + ("RPVO", 11.0558333333, 124.565555556), + ("RPVP", 9.74194444444, 118.758611111), + ("RPVR", 11.5975, 122.752777778), + ("RPVS", 10.7661111111, 121.932222222), + ("SAAC", -31.2969444444, -57.9963888889), + ("SAAG", -33.0058333333, -58.6130555556), + ("SAAI", -35.3477777778, -57.2938888889), + ("SAAJ", -34.5458333333, -60.9305555556), + ("SAAP", -31.7947222222, -60.4802777778), + ("SAAR", -32.9033333333, -60.7844444444), + ("SAAV", -31.7116666667, -60.8116666667), + ("SABE", -34.5591666667, -58.4155555556), + ("SACC", -31.0066666667, -64.5325), + ("SACO", -31.3236111111, -64.2077777778), + ("SACT", -30.3452777778, -66.2936111111), + ("SADD", -34.5005555556, -58.6041666667), + ("SADF", -34.4530555556, -58.5894444444), + ("SADJ", -34.5605555556, -58.7894444444), + ("SADL", -34.9722222222, -57.8944444444), + ("SADM", -34.6761111111, -58.6425), + ("SADP", -34.6097222222, -58.6125), + ("SADS", -34.7313888889, -58.5994444444), + ("SAHC", -37.4444444444, -70.2222222222), + ("SAHR", -39.0005555556, -67.6202777778), + ("SAME", -32.8316666667, -68.7927777778), + ("SAMM", -35.4838888889, -69.5825), + ("SAMQ", -32.8658333333, -68.8722222222), + ("SAMR", -34.5880555556, -68.4025), + ("SANC", -28.5955555556, -65.7516666667), + ("SANE", -27.7655555556, -64.31), + ("SANI", -28.0375, -67.5802777778), + ("SANL", -29.3813888889, -66.7958333333), + ("SANO", -29.2238888889, -67.4388888889), + ("SANT", -26.8408333333, -65.1047222222), + ("SANU", -31.5713888889, -68.4180555556), + ("SAOC", -33.0855555556, -64.2613888889), + ("SAOD", -31.9411111111, -65.1422222222), + ("SAOL", -34.1352777778, -63.3622222222), + ("SAOM", -32.6836111111, -62.1577777778), + ("SAOR", -33.7297222222, -65.3872222222), + ("SAOU", -33.2730555556, -66.3563888889), + ("SARC", -27.4452777778, -58.7616666667), + ("SARE", -27.4497222222, -59.0561111111), + ("SARF", -26.2125, -58.2280555556), + ("SARI", -25.7375, -54.4730555556), + ("SARL", -29.6891666667, -57.1519444444), + ("SARM", -30.2716666667, -57.64), + ("SARP", -27.3858333333, -55.9705555556), + ("SARS", -26.7563888889, -60.4930555556), + ("SASA", -24.8558333333, -65.4861111111), + ("SASJ", -24.3927777778, -65.0977777778), + ("SASO", -23.1527777778, -64.3291666667), + ("SASQ", -22.1622222222, -65.5697222222), + ("SAST", -22.6197222222, -63.7936111111), + ("SATG", -29.1058333333, -59.2186111111), + ("SATK", -24.7211111111, -60.5486111111), + ("SATM", -29.2230555556, -58.0880555556), + ("SATO", -27.5180555556, -55.1238888889), + ("SATR", -29.21, -59.6908333333), + ("SATU", -29.7705555556, -57.9788888889), + ("SAVB", -41.9430555556, -71.5322222222), + ("SAVC", -45.785, -67.4655555556), + ("SAVD", -42.0305555556, -71.1697222222), + ("SAVE", -42.9077777778, -71.1394444444), + ("SAVH", -46.5383333333, -68.9658333333), + ("SAVT", -43.2102777778, -65.2702777778), + ("SAVV", -40.8691666667, -63.0002777778), + ("SAVY", -42.7588888889, -65.1025), + ("SAWA", -50.3352777778, -72.2483333333), + ("SAWB", -64.2383333333, -56.6308333333), + ("SAWD", -47.7352777778, -65.9038888889), + ("SAWE", -53.7775, -67.7491666667), + ("SAWG", -51.6086111111, -69.3125), + ("SAWH", -54.8430555556, -68.2955555556), + ("SAWJ", -49.3066666667, -67.8025), + ("SAWS", -44.0480555556, -70.4591666667), + ("SAWT", -51.6063888889, -72.2166666667), + ("SAWU", -50.0163888889, -68.5791666667), + ("SAZB", -38.7247222222, -62.1691666667), + ("SAZC", -37.4461111111, -61.8891666667), + ("SAZD", -36.3202777778, -57.7216666667), + ("SAZF", -36.8908333333, -60.2161111111), + ("SAZG", -35.6961111111, -63.7580555556), + ("SAZH", -38.3866666667, -60.3294444444), + ("SAZI", -36.1869444444, -61.0761111111), + ("SAZL", -36.5422222222, -56.7216666667), + ("SAZM", -37.9341666667, -57.5733333333), + ("SAZN", -38.9488888889, -68.1555555556), + ("SAZO", -38.4894444444, -58.8158333333), + ("SAZP", -35.8455555556, -61.8577777778), + ("SAZR", -36.5880555556, -64.2752777778), + ("SAZS", -41.1511111111, -71.1575), + ("SAZT", -37.2372222222, -59.2277777778), + ("SAZV", -37.2352777778, -57.0291666667), + ("SAZW", -38.9394444444, -69.2644444444), + ("SAZY", -40.0752777778, -71.1372222222), + ("SBAA", -8.34833333333, -49.3013888889), + ("SBAF", -22.875, -43.3844444444), + ("SBAM", 2.07666666667, -50.8622222222), + ("SBAQ", -21.8119444444, -48.1327777778), + ("SBAR", -10.9838888889, -37.0702777778), + ("SBAS", -22.6383333333, -50.4558333333), + ("SBAT", -9.86583333333, -56.1061111111), + ("SBAU", -21.1411111111, -50.4247222222), + ("SBAV", -22.5255555556, -52.9719444444), + ("SBBE", -1.37916666667, -48.4761111111), + ("SBBG", -31.3902777778, -54.1122222222), + ("SBBH", -19.8516666667, -43.9502777778), + ("SBBI", -25.405, -49.2319444444), + ("SBBQ", -21.2669444444, -43.7608333333), + ("SBBR", -15.8625, -47.9125), + ("SBBU", -22.345, -49.0536111111), + ("SBBV", 2.84611111111, -60.69), + ("SBBW", -15.8611111111, -52.3888888889), + ("SBCA", -25.0002777778, -53.5005555556), + ("SBCC", -9.33388888889, -54.9652777778), + ("SBCF", -19.6336111111, -43.9686111111), + ("SBCG", -20.4686111111, -54.6725), + ("SBCH", -27.1341666667, -52.6563888889), + ("SBCI", -7.32027777778, -47.4586111111), + ("SBCM", -28.7255555556, -49.4247222222), + ("SBCO", -29.9458333333, -51.1444444444), + ("SBCP", -21.6983333333, -41.3016666667), + ("SBCR", -19.0116666667, -57.6727777778), + ("SBCT", -25.5283333333, -49.1755555556), + ("SBCV", -17.6522222222, -39.2530555556), + ("SBCX", -29.1969444444, -51.1875), + ("SBCY", -15.6527777778, -56.1166666667), + ("SBCZ", -7.6, -72.7694444444), + ("SBDN", -22.175, -51.4244444444), + ("SBEG", -3.03861111111, -60.0497222222), + ("SBEK", -6.23305555556, -57.7766666667), + ("SBES", -22.8127777778, -42.0925), + ("SBFC", -20.5919444444, -47.3827777778), + ("SBFI", -25.5961111111, -54.4869444444), + ("SBFL", -27.6725, -48.5477777778), + ("SBFN", -3.85472222222, -32.4233333333), + ("SBFT", -20.2783333333, -49.1872222222), + ("SBFU", -20.7027777778, -46.335), + ("SBFZ", -3.77611111111, -38.5325), + ("SBGL", -22.8088888889, -43.2436111111), + ("SBGM", -10.7861111111, -65.2847222222), + ("SBGO", -16.6311111111, -49.2222222222), + ("SBGR", -23.4322222222, -46.4691666667), + ("SBGS", -25.1844444444, -50.1438888889), + ("SBGW", -22.7913888889, -45.2047222222), + ("SBHT", -3.25388888889, -52.2538888889), + ("SBIC", -3.12722222222, -58.4811111111), + ("SBIH", -4.24222222222, -56.0005555556), + ("SBIL", -14.8158333333, -39.0330555556), + ("SBIP", -19.4705555556, -42.4875), + ("SBIT", -18.4444444444, -49.2133333333), + ("SBIZ", -5.53111111111, -47.46), + ("SBJC", -1.41388888889, -48.4605555556), + ("SBJF", -21.7913888889, -43.3866666667), + ("SBJP", -7.26972222222, -35.8961111111), + ("SBJV", -26.2247222222, -48.7972222222), + ("SBKP", -23.0080555556, -47.1344444444), + ("SBLJ", -27.7819444444, -50.2813888889), + ("SBLN", -21.6638888889, -49.7302777778), + ("SBLO", -23.3336111111, -51.13), + ("SBLP", -13.2619444444, -43.4080555556), + ("SBLS", -19.6613888889, -43.8963888889), + ("SBMA", -5.36833333333, -49.1377777778), + ("SBMD", -0.889722222222, -52.6022222222), + ("SBMG", -23.4397222222, -51.9069444444), + ("SBMK", -16.7066666667, -43.8188888889), + ("SBML", -22.1966666667, -49.9263888889), + ("SBMN", -3.14555555556, -59.9861111111), + ("SBMO", -9.51027777778, -35.7933333333), + ("SBMQ", 0.0505555555556, -51.0719444444), + ("SBMS", -5.20166666667, -37.3641666667), + ("SBMT", -23.5088888889, -46.6375), + ("SBMY", -5.81138888889, -61.2786111111), + ("SBNF", -26.88, -48.6513888889), + ("SBNM", -28.2816666667, -54.1688888889), + ("SBNT", -5.91111111111, -35.2477777778), + ("SBOI", 3.85527777778, -51.7966666667), + ("SBPA", -29.9941666667, -51.1713888889), + ("SBPB", -2.89361111111, -41.7319444444), + ("SBPC", -21.8427777778, -46.5677777778), + ("SBPF", -28.2438888889, -52.3263888889), + ("SBPK", -31.7183333333, -52.3275), + ("SBPL", -9.36388888889, -40.5638888889), + ("SBPN", -10.7191666667, -48.3997222222), + ("SBPP", -22.5494444444, -55.7025), + ("SBPV", -8.70916666667, -63.9022222222), + ("SBQV", -14.8625, -40.8630555556), + ("SBRB", -9.86888888889, -67.8936111111), + ("SBRF", -8.12638888889, -34.9233333333), + ("SBRG", -32.0825, -52.1663888889), + ("SBRJ", -22.9102777778, -43.1630555556), + ("SBRP", -21.1341666667, -47.7741666667), + ("SBSC", -22.9322222222, -43.7188888889), + ("SBSJ", -23.2291666667, -45.8613888889), + ("SBSL", -2.58861111111, -44.2363888889), + ("SBSM", -29.7111111111, -53.6880555556), + ("SBSP", -23.6266666667, -46.6552777778), + ("SBSR", -20.8163888889, -49.4063888889), + ("SBST", -23.925, -46.2875), + ("SBSV", -12.9108333333, -38.3308333333), + ("SBTB", -1.48944444444, -56.3966666667), + ("SBTE", -5.05972222222, -42.8233333333), + ("SBTF", -3.38277777778, -64.7238888889), + ("SBTK", -8.155, -70.7830555556), + ("SBTL", -24.3175, -50.6513888889), + ("SBTS", 2.22333333333, -55.9458333333), + ("SBTT", -4.25555555556, -69.9355555556), + ("SBTU", -3.785, -49.7194444444), + ("SBUA", -0.148333333333, -66.9855555556), + ("SBUF", -9.40083333333, -38.2505555556), + ("SBUG", -29.7819444444, -57.0380555556), + ("SBUL", -18.8827777778, -48.2255555556), + ("SBUP", -20.7769444444, -51.5647222222), + ("SBUR", -19.765, -47.9647222222), + ("SBVG", -21.59, -45.4733333333), + ("SBVH", -12.6941666667, -60.0980555556), + ("SBVT", -20.2555555556, -40.2888888889), + ("SBYA", 0.6075, -69.1858333333), + ("SBYS", -21.9852777778, -47.3380555556), + ("SCAC", -41.9061111111, -73.7966666667), + ("SCAP", -43.6152777778, -71.8069444444), + ("SCAR", -18.3483333333, -70.3386111111), + ("SCBA", -45.9158333333, -71.6891666667), + ("SCBQ", -33.5616666667, -70.6883333333), + ("SCCC", -46.5816666667, -71.6975), + ("SCCF", -22.4986111111, -68.9041666667), + ("SCCH", -36.5827777778, -72.0316666667), + ("SCCI", -53.0027777778, -70.8547222222), + ("SCCY", -45.5941666667, -72.1061111111), + ("SCDA", -20.535, -70.1811111111), + ("SCEL", -33.3927777778, -70.7855555556), + ("SCFA", -23.4444444444, -70.445), + ("SCFM", -53.2536111111, -70.3191666667), + ("SCGE", -37.4016666667, -72.4255555556), + ("SCGZ", -54.9308333333, -67.6261111111), + ("SCHA", -27.2961111111, -70.4136111111), + ("SCIC", -34.9669444444, -71.2169444444), + ("SCIE", -36.7725, -73.0630555556), + ("SCIP", -27.1647222222, -109.421666667), + ("SCJO", -40.6113888889, -73.0602777778), + ("SCLL", -28.5975, -70.7591666667), + ("SCRG", -34.1736111111, -70.7755555556), + ("SCRM", -62.1908333333, -58.9866666667), + ("SCSE", -29.9163888889, -71.1911111111), + ("SCSN", -33.6566666667, -71.6155555556), + ("SCST", -42.4908333333, -73.7744444444), + ("SCTB", -33.4563888889, -70.5466666667), + ("SCTC", -38.7686111111, -72.6358333333), + ("SCTE", -41.4386111111, -73.0938888889), + ("SCTI", -33.4933333333, -70.6975), + ("SCTN", -42.9330555556, -72.6991666667), + ("SCVD", -39.6497222222, -73.0861111111), + ("SEAM", -1.2125, -78.5741666667), + ("SECM", -1.70611111111, -79.3788888889), + ("SECO", -0.462777777778, -76.9863888889), + ("SECU", -2.88944444444, -78.9841666667), + ("SEGS", -0.453611111111, -90.2658333333), + ("SEGU", -2.15777777778, -79.8838888889), + ("SEGZ", -3.42333333333, -78.5730555556), + ("SEIB", 0.338333333333, -78.1363888889), + ("SELA", 0.0922222222222, -76.8691666667), + ("SELJ", -1.70416666667, -79.5522222222), + ("SELM", -1.50138888889, -79.4808333333), + ("SELT", -0.906666666667, -78.6155555556), + ("SEMA", -4.38027777778, -79.9405555556), + ("SEMC", -2.29916666667, -78.1205555556), + ("SEMH", -3.26888888889, -79.9616666667), + ("SEMO", -2.06694444444, -76.9752777778), + ("SEMT", -0.945555555556, -80.6780555556), + ("SEMX", -2.85083333333, -79.8036111111), + ("SEMY", -1.73972222222, -79.6216666667), + ("SEPD", 0.0730555555556, -80.0522222222), + ("SEPV", -1.04138888889, -80.4719444444), + ("SEQU", -0.141111111111, -78.4880555556), + ("SERB", -1.65361111111, -78.6561111111), + ("SERO", -3.43527777778, -79.9777777778), + ("SESA", -2.20472222222, -80.9886111111), + ("SESD", -0.248055555556, -79.2144444444), + ("SEST", -0.909722222222, -89.6158333333), + ("SETA", -2.26083333333, -79.6891666667), + ("SETE", -0.986666666667, -77.8194444444), + ("SETR", -0.122777777778, -76.3375), + ("SETU", 0.809444444444, -77.7080555556), + ("SFAL", -51.6855555556, -57.7775), + ("SGAS", -25.2397222222, -57.5188888889), + ("SGAY", -27.3705555556, -56.8538888889), + ("SGCO", -23.4416666667, -57.4269444444), + ("SGFI", -22.3597222222, -60.0536111111), + ("SGIB", -25.4075, -54.6194444444), + ("SGME", -22.0447222222, -60.6216666667), + ("SGPI", -26.8813888889, -58.3177777778), + ("SKAR", 4.45361111111, -75.7652777778), + ("SKAS", 0.505, -76.5008333333), + ("SKBC", 9.04527777778, -73.9747222222), + ("SKBG", 7.12638888889, -73.1847222222), + ("SKBO", 4.70138888889, -74.1469444444), + ("SKBQ", 10.8894444444, -74.7805555556), + ("SKBS", 6.20277777778, -77.3944444444), + ("SKBU", 3.81944444444, -76.9897222222), + ("SKCC", 7.9275, -72.5113888889), + ("SKCD", 5.07166666667, -76.6763888889), + ("SKCG", 10.4422222222, -75.5127777778), + ("SKCL", 3.54305555556, -76.3813888889), + ("SKCO", 1.81416666667, -78.7491666667), + ("SKCZ", 9.3325, -75.2855555556), + ("SKEJ", 7.02416666667, -73.8066666667), + ("SKFL", 1.59027777778, -75.5638888889), + ("SKGI", 4.27611111111, -74.7966666667), + ("SKGO", 4.75805555556, -75.9555555556), + ("SKGP", 2.57, -77.8983333333), + ("SKGY", 4.81222222222, -74.0647222222), + ("SKIB", 4.42138888889, -75.1330555556), + ("SKIP", 0.861666666667, -77.6716666667), + ("SKLC", 7.81194444444, -76.7163888889), + ("SKLM", 11.2325, -72.49), + ("SKLT", -4.19305555556, -69.9425), + ("SKMD", 6.22, -75.5905555556), + ("SKMG", 9.28333333333, -74.8394444444), + ("SKMR", 8.82361111111, -75.8258333333), + ("SKMU", 1.25361111111, -70.2336111111), + ("SKMZ", 5.02972222222, -75.465), + ("SKNV", 2.95, -75.2938888889), + ("SKOC", 8.31472222222, -73.3583333333), + ("SKOT", 7.01027777778, -74.7152777778), + ("SKPB", 12.2213888889, -71.9847222222), + ("SKPC", 6.18444444444, -67.4930555556), + ("SKPE", 4.8125, -75.7394444444), + ("SKPI", 1.85833333333, -76.0858333333), + ("SKPP", 2.45416666667, -76.61), + ("SKPS", 1.39638888889, -77.2908333333), + ("SKPV", 13.3569444444, -81.3583333333), + ("SKQU", 5.2125, -74.8836111111), + ("SKRG", 6.16444444444, -75.4230555556), + ("SKRH", 11.5261111111, -72.9258333333), + ("SKSA", 6.95805555556, -71.855), + ("SKSJ", 2.57944444444, -72.6391666667), + ("SKSM", 11.1194444444, -74.2305555556), + ("SKSP", 12.5833333333, -81.7111111111), + ("SKSV", 2.15194444444, -74.7661111111), + ("SKTD", 5.43027777778, -71.6580555556), + ("SKTM", 6.45083333333, -71.76), + ("SKTU", 8.07444444444, -76.7411111111), + ("SKUC", 7.06861111111, -70.7366666667), + ("SKUI", 5.69055555556, -76.6411111111), + ("SKUL", 4.08833333333, -76.235), + ("SKVP", 10.435, -73.2494444444), + ("SKVV", 4.16777777778, -73.6136111111), + ("SKYP", 5.31888888889, -72.3838888889), + ("SLAP", -14.7394444444, -68.4108333333), + ("SLAS", -15.7191666667, -63.0922222222), + ("SLBJ", -22.7694444444, -64.315), + ("SLCA", -20.0069444444, -63.5275), + ("SLCB", -17.4208333333, -66.1769444444), + ("SLCH", -16.99, -65.1413888889), + ("SLCN", -17.5938888889, -69.4341666667), + ("SLCO", -11.0402777778, -68.7827777778), + ("SLCP", -16.1433333333, -62.0258333333), + ("SLGY", -10.8216666667, -65.3458333333), + ("SLJO", -13.0527777778, -64.6616666667), + ("SLLP", -16.5130555556, -68.1922222222), + ("SLMG", -13.2536111111, -64.0627777778), + ("SLOR", -17.9633333333, -67.0761111111), + ("SLPO", -19.5433333333, -65.7238888889), + ("SLPS", -18.9752777778, -57.8205555556), + ("SLRA", -13.2636111111, -64.6052777778), + ("SLRB", -18.3280555556, -59.7661111111), + ("SLRI", -11.0102777778, -66.0733333333), + ("SLRQ", -14.4283333333, -67.5013888889), + ("SLRY", -14.3061111111, -67.3536111111), + ("SLSA", -13.7619444444, -65.435), + ("SLSB", -14.8575, -66.7375), + ("SLSI", -16.3844444444, -60.9627777778), + ("SLSM", -14.9655555556, -65.6336111111), + ("SLSU", -19.0069444444, -65.2888888889), + ("SLTI", -16.3386111111, -58.4016666667), + ("SLTJ", -21.5555555556, -64.7008333333), + ("SLTR", -14.8194444444, -64.9183333333), + ("SLVR", -17.6447222222, -63.1352777778), + ("SMJP", 5.45277777778, -55.1877777778), + ("SMZO", 5.81083333333, -55.1905555556), + ("SOCA", 4.81972222222, -52.3602777778), + ("SOOG", 3.8975, -51.8038888889), + ("SPAC", -4.6075, -77.9408333333), + ("SPAS", -2.795, -76.4661111111), + ("SPAY", -10.7288888889, -73.7663888889), + ("SPBB", -6.01888888889, -76.9883333333), + ("SPBC", -3.91666666667, -70.5080555556), + ("SPBR", -11.4113888889, -69.4886111111), + ("SPCL", -8.37777777778, -74.5741666667), + ("SPEO", -9.15083333333, -78.5236111111), + ("SPEP", -9.76805555556, -70.7063888889), + ("SPEQ", -17.1788888889, -70.9305555556), + ("SPGM", -9.29, -76.0058333333), + ("SPHI", -6.78722222222, -79.8280555556), + ("SPHO", -13.1547222222, -74.2041666667), + ("SPHY", -13.7063888889, -73.3502777778), + ("SPHZ", -9.34722222222, -77.5983333333), + ("SPIM", -12.0216666667, -77.1141666667), + ("SPJI", -7.16944444444, -76.7277777778), + ("SPJJ", -11.7830555556, -75.4733333333), + ("SPJL", -15.4669444444, -70.1580555556), + ("SPJN", -15.3575, -75.1355555556), + ("SPJR", -7.13638888889, -78.49), + ("SPLO", -17.695, -71.3438888889), + ("SPLP", -12.1605555556, -76.9988888889), + ("SPME", -3.5525, -80.3808333333), + ("SPMS", -5.89388888889, -76.1183333333), + ("SPNC", -9.87805555556, -76.2041666667), + ("SPOL", -11.9286111111, -77.0611111111), + ("SPPY", -6.20166666667, -77.8558333333), + ("SPQT", -3.78472222222, -73.3086111111), + ("SPQU", -16.3408333333, -71.5830555556), + ("SPRM", -11.1286111111, -75.3502777778), + ("SPRU", -8.08472222222, -79.1094444444), + ("SPSO", -13.7447222222, -76.2202777778), + ("SPST", -6.50861111111, -76.3730555556), + ("SPTN", -18.0533333333, -70.2758333333), + ("SPTP", -4.54972222222, -81.2238888889), + ("SPTU", -12.6136111111, -69.2288888889), + ("SPUR", -5.20555555556, -80.6163888889), + ("SPYL", -4.57638888889, -81.2538888889), + ("SPZA", -14.8538888889, -74.9613888889), + ("SPZO", -13.5355555556, -71.9386111111), + ("SUAA", -34.7891666667, -56.2644444444), + ("SUAG", -30.4005555556, -56.5077777778), + ("SUCA", -34.4563888889, -57.7705555556), + ("SUDU", -33.3586111111, -56.4991666667), + ("SULS", -34.855, -55.0941666667), + ("SUMO", -32.3377777778, -54.2166666667), + ("SUMU", -34.8377777778, -56.0302777778), + ("SUPE", -34.9136111111, -54.9205555556), + ("SUPU", -32.365, -58.0611111111), + ("SURV", -30.9744444444, -55.4761111111), + ("SUSO", -31.4397222222, -57.9905555556), + ("SUTB", -31.7488888889, -55.9255555556), + ("SVAC", 9.55333333333, -69.2377777778), + ("SVAN", 9.42916666667, -64.4708333333), + ("SVAT", 4.05166666667, -67.7008333333), + ("SVBC", 10.1069444444, -64.6888888889), + ("SVBI", 8.61944444444, -70.2205555556), + ("SVBL", 10.1833333333, -67.5572222222), + ("SVBM", 10.0425, -69.3583333333), + ("SVBS", 10.2497222222, -67.6491666667), + ("SVCB", 8.12194444444, -63.5369444444), + ("SVCD", 7.62583333333, -66.1647222222), + ("SVCJ", 9.64888888889, -68.5752777778), + ("SVCL", 8.92444444444, -67.4169444444), + ("SVCN", 6.23194444444, -62.8541666667), + ("SVCO", 10.1755555556, -70.065), + ("SVCP", 10.66, -63.2616666667), + ("SVCR", 11.4147222222, -69.6808333333), + ("SVCS", 10.2861111111, -66.8158333333), + ("SVCU", 10.4502777778, -64.1302777778), + ("SVCZ", 9.37194444444, -66.9227777778), + ("SVED", 6.715, -61.6388888889), + ("SVEZ", 7.05972222222, -69.4966666667), + ("SVGD", 7.21083333333, -70.7563888889), + ("SVGI", 10.5738888889, -62.3125), + ("SVGU", 9.02694444444, -69.755), + ("SVHG", 10.4622222222, -66.0925), + ("SVIE", 10.7941666667, -63.9813888889), + ("SVJC", 11.7808333333, -70.1516666667), + ("SVJM", 9.90694444444, -67.3794444444), + ("SVLF", 8.23916666667, -72.2708333333), + ("SVLO", 11.8086111111, -66.1791666667), + ("SVMC", 10.5580555556, -71.7277777778), + ("SVMD", 8.58194444444, -71.1608333333), + ("SVMG", 10.9125, -63.9663888889), + ("SVMI", 10.6030555556, -66.9905555556), + ("SVMT", 9.74916666667, -63.1522222222), + ("SVPA", 5.61972222222, -67.6058333333), + ("SVPC", 10.4802777778, -68.0727777778), + ("SVPM", 7.80111111111, -72.2027777778), + ("SVPR", 8.28833333333, -62.7602777778), + ("SVPT", 7.57555555556, -70.1741666667), + ("SVSA", 7.85222222222, -72.4347222222), + ("SVSB", 7.80333333333, -71.1655555556), + ("SVSO", 7.565, -72.035), + ("SVSP", 10.2786111111, -68.755), + ("SVSR", 7.8825, -67.4436111111), + ("SVST", 8.945, -64.1508333333), + ("SVSZ", 8.97444444444, -71.9430555556), + ("SVTC", 9.08888888889, -62.0941666667), + ("SVTM", 7.24916666667, -61.5288888889), + ("SVVA", 10.1580555556, -67.9266666667), + ("SVVG", 8.62416666667, -71.6727777778), + ("SVVL", 9.34055555556, -70.5838888889), + ("SVVP", 9.22194444444, -65.9933333333), + ("SYKM", 5.86527777778, -60.6141666667), + ("SYLD", 5.96583333333, -58.2702777778), + ("SYLT", 3.3725, -59.7891666667), + ("TAPA", 17.1366666667, -61.7925), + ("TBPB", 13.0744444444, -59.4922222222), + ("TDCF", 15.3366666667, -61.3919444444), + ("TDPD", 15.5469444444, -61.3), + ("TFFF", 14.5908333333, -61.0030555556), + ("TFFG", 18.0997222222, -63.0469444444), + ("TFFJ", 17.9, -62.85), + ("TFFM", 15.8686111111, -61.27), + ("TFFR", 16.2652777778, -61.5316666667), + ("TGPY", 12.0041666667, -61.7861111111), + ("TIST", 18.3372222222, -64.9733333333), + ("TISX", 17.7016666667, -64.7983333333), + ("TJBQ", 18.4947222222, -67.1294444444), + ("TJFA", 18.3088888889, -65.6616666667), + ("TJIG", 18.4566666667, -66.0980555556), + ("TJMZ", 18.2555555556, -67.1483333333), + ("TJNR", 18.245, -65.6433333333), + ("TJPS", 18.0080555556, -66.5627777778), + ("TJSJ", 18.4391666667, -66.0016666667), + ("TKPK", 17.3111111111, -62.7186111111), + ("TKPN", 17.2055555556, -62.5897222222), + ("TLPC", 14.02, -60.9927777778), + ("TLPL", 13.7330555556, -60.9525), + ("TNCA", 12.5013888889, -70.015), + ("TNCB", 12.1308333333, -68.2683333333), + ("TNCC", 12.1886111111, -68.9597222222), + ("TNCE", 17.4963888889, -62.9791666667), + ("TNCM", 18.0408333333, -63.1088888889), + ("TQPF", 18.2047222222, -63.055), + ("TRPM", 33.5869444444, -80.2086111111), + ("TTCP", 11.1494444444, -60.8319444444), + ("TTPP", 10.5952777778, -61.3372222222), + ("TUPJ", 18.4447222222, -64.5427777778), + ("TVSB", 12.9883333333, -61.2619444444), + ("TVSC", 12.6988888889, -61.3422222222), + ("TVSM", 12.8875, -61.18), + ("TVSV", 13.1441666667, -61.2108333333), + ("UAAA", 43.3519444444, 77.0402777778), + ("UAAH", 46.8941666667, 75.0047222222), + ("UACC", 51.0222222222, 71.4672222222), + ("UAFM", 43.0616666667, 74.4783333333), + ("UAFO", 40.6088888889, 72.7930555556), + ("UAII", 42.3644444444, 69.4791666667), + ("UAKD", 47.7083333333, 67.7333333333), + ("UARR", 51.1516666667, 51.5455555556), + ("UASS", 50.3511111111, 80.2341666667), + ("UATE", 43.86, 51.0919444444), + ("UATT", 50.245, 57.2033333333), + ("UAUU", 53.2063888889, 63.5508333333), + ("UBBB", 40.4675, 50.0466666667), + ("UEEA", 34.8041666667, -96.6711111111), + ("UEEE", 62.0930555556, 129.770555556), + ("UERP", 66.4166666667, 112.05), + ("UGEE", 40.1483333333, 44.3966666667), + ("UGGG", 41.6691666667, 44.9547222222), + ("UGSS", 42.8580555556, 41.1280555556), + ("UHBB", 50.4216666667, 127.41), + ("UHHH", 48.5277777778, 135.188333333), + ("UHMA", 64.7347222222, 177.741388889), + ("UHMD", 64.38, -173.246666667), + ("UHMM", 59.91, 150.716666667), + ("UHMP", 67.5, 171.0), + ("UHPP", 53.1663888889, 158.452777778), + ("UHSH", 53.515, 142.888333333), + ("UHSS", 46.8886111111, 142.717222222), + ("UHWW", 43.3988888889, 132.151388889), + ("UIAA", 52.0261111111, 113.305), + ("UIBB", 56.3708333333, 101.698611111), + ("UIII", 52.2669444444, 104.394722222), + ("UIUU", 51.8066666667, 107.438055556), + ("UKBB", 50.345, 30.895), + ("UKCC", 48.0733333333, 37.74), + ("UKDD", 48.3566666667, 35.1016666667), + ("UKFF", 45.0386111111, 33.9830555556), + ("UKHH", 49.3588888889, 26.9338888889), + ("UKKK", 50.4016666667, 30.4516666667), + ("UKLL", 49.8125, 23.9561111111), + ("UKLN", 48.26, 25.9816666667), + ("UKOO", 46.4269444444, 30.6780555556), + ("ULLI", 59.8, 30.265), + ("ULMM", 68.7816666667, 32.7505555556), + ("UMGG", 52.5269444444, 31.0166666667), + ("UMII", 55.1666666667, 30.1333333333), + ("UMKK", 54.89, 20.5925), + ("UMMM", 53.8644444444, 27.5394444444), + ("UMMS", 53.8822222222, 28.0305555556), + ("UNAA", 53.74, 91.385), + ("UNBB", 53.3638888889, 83.5419444444), + ("UNEE", 55.2697222222, 86.1069444444), + ("UNOO", 54.9669444444, 73.31), + ("URKK", 45.035, 39.1716666667), + ("URML", 42.8166666667, 47.6522222222), + ("URMM", 44.225, 43.0816666667), + ("URMT", 45.1091666667, 42.1127777778), + ("URRR", 47.2580555556, 39.8177777778), + ("URSS", 43.4458333333, 39.9475), + ("URWA", 46.2833333333, 48.0061111111), + ("URWW", 48.7822222222, 44.3447222222), + ("USCC", 55.3033333333, 61.5066666667), + ("USCM", 53.3933333333, 58.76), + ("USDD", 66.59, 66.6102777778), + ("USNN", 60.95, 76.4666666667), + ("USPP", 57.9166666667, 56.0255555556), + ("USRR", 61.25, 73.5), + ("USSS", 56.7413888889, 60.8036111111), + ("USTO", 37.1322222222, -92.0838888889), + ("USUU", 55.475, 65.4147222222), + ("UTAA", 37.9916666667, 58.3633333333), + ("UTAK", 40.0333333333, 52.9833333333), + ("UTAV", 39.0833333333, 63.6133333333), + ("UTDD", 38.5433333333, 68.825), + ("UTNN", 42.4863888889, 59.6225), + ("UTSB", 39.775, 64.48), + ("UTSS", 39.7005555556, 66.9847222222), + ("UTST", 37.2863888889, 67.3083333333), + ("UTTT", 41.2572222222, 69.2816666667), + ("UUBP", 53.2141666667, 34.1763888889), + ("UUEE", 55.9716666667, 37.415), + ("UUEM", 56.8247222222, 35.7575), + ("UUOO", 51.8141666667, 39.2297222222), + ("UUWW", 55.5913888889, 37.2613888889), + ("UUYY", 61.6475, 50.8455555556), + ("UWKD", 55.6077777778, 49.2772222222), + ("UWOO", 51.7955555556, 55.4566666667), + ("UWPP", 28.9541666667, -98.5197222222), + ("UWUU", 54.5575, 55.8741666667), + ("UWWW", 53.5052777778, 50.1644444444), + ("VAAH", 23.0747222222, 72.6316666667), + ("VAAK", 20.6988888889, 77.0563888889), + ("VAAU", 19.8630555556, 75.3980555556), + ("VABB", 19.0886111111, 72.8677777778), + ("VABI", 21.9886111111, 82.1111111111), + ("VABJ", 23.2877777778, 69.67), + ("VABM", 15.8591666667, 74.6180555556), + ("VABO", 22.3361111111, 73.2261111111), + ("VABP", 23.285, 77.3372222222), + ("VABV", 21.7519444444, 72.185), + ("VADN", 20.435, 72.8436111111), + ("VADS", 24.2677777778, 72.2052777778), + ("VAGO", 15.3805555556, 73.8330555556), + ("VAID", 22.7216666667, 75.8008333333), + ("VAJB", 23.1777777778, 80.0519444444), + ("VAJJ", 19.0980555556, 72.8338888889), + ("VAJM", 22.4663888889, 70.0113888889), + ("VAKE", 23.1125, 70.1002777778), + ("VAKJ", 24.8194444444, 79.9191666667), + ("VAKP", 16.6638888889, 74.2880555556), + ("VAKS", 21.3166666667, 70.27), + ("VANP", 21.0919444444, 79.0469444444), + ("VANR", 19.9625, 73.8069444444), + ("VAPO", 18.5819444444, 73.9194444444), + ("VAPR", 21.6494444444, 69.6563888889), + ("VARK", 22.3091666667, 70.7794444444), + ("VARP", 21.1802777778, 81.7386111111), + ("VASL", 17.6277777778, 75.9347222222), + ("VASU", 21.115, 72.7427777778), + ("VAUD", 24.6175, 73.9127777778), + ("VCBI", 7.18111111111, 79.8836111111), + ("VCCA", 8.30111111111, 80.4280555556), + ("VCCB", 7.70555555556, 81.6777777778), + ("VCCC", 6.82194444444, 79.8861111111), + ("VCCG", 7.3375, 81.6255555556), + ("VCCJ", 9.79222222222, 80.07), + ("VCCT", 8.53888888889, 81.1813888889), + ("VCCW", 6.25444444444, 81.235), + ("VDBG", 13.0955555556, 103.224166667), + ("VDKH", 12.255, 104.563611111), + ("VDPP", 11.5463888889, 104.843888889), + ("VDSR", 13.4105555556, 103.812777778), + ("VDST", 13.5313888889, 106.014166667), + ("VEAN", 28.1747222222, 94.8019444444), + ("VEAT", 23.8888888889, 91.2408333333), + ("VEAZ", 23.7461111111, 92.8030555556), + ("VEBD", 26.6813888889, 88.3280555556), + ("VEBG", 25.2608333333, 88.7955555556), + ("VEBK", 23.6433333333, 86.1486111111), + ("VEBS", 20.2441666667, 85.8177777778), + ("VECC", 22.6547222222, 88.4466666667), + ("VECO", 26.3302777778, 89.4669444444), + ("VEDB", 23.8338888889, 86.425), + ("VEDZ", 27.9888888889, 94.2233333333), + ("VEGK", 26.7394444444, 83.4494444444), + ("VEGT", 26.1061111111, 91.5847222222), + ("VEGY", 24.7480555556, 84.9425), + ("VEHK", 21.5791666667, 84.0061111111), + ("VEIM", 24.7597222222, 93.8969444444), + ("VEJH", 21.9133333333, 84.0502777778), + ("VEJP", 18.8797222222, 82.5519444444), + ("VEJS", 22.8119444444, 86.1675), + ("VEJT", 26.7305555556, 94.1755555556), + ("VEKM", 24.135, 91.8105555556), + ("VEKR", 24.3083333333, 92.0075), + ("VEKU", 24.9127777778, 92.9786111111), + ("VELR", 27.2905555556, 94.0966666667), + ("VEMN", 27.4833333333, 95.0175), + ("VEMZ", 26.12, 85.3130555556), + ("VENP", 20.87, 82.5194444444), + ("VEPG", 28.0661111111, 95.3355555556), + ("VEPH", 23.4744444444, 87.4277777778), + ("VEPT", 25.5905555556, 85.0877777778), + ("VEPU", 25.76, 87.4091666667), + ("VERC", 23.3147222222, 85.3213888889), + ("VERK", 22.2563888889, 84.8144444444), + ("VEUK", 20.0975, 83.1833333333), + ("VEZO", 27.5880555556, 93.8283333333), + ("VGCB", 21.4519444444, 91.9641666667), + ("VGEG", 22.2494444444, 91.8130555556), + ("VGIS", 24.1525, 89.0494444444), + ("VGJR", 23.1836111111, 89.1608333333), + ("VGRJ", 24.4369444444, 88.6163888889), + ("VGSD", 25.7591666667, 88.9086111111), + ("VGSY", 24.9627777778, 91.8672222222), + ("VGTJ", 23.7783333333, 90.3825), + ("VGZR", 23.8433333333, 90.3977777778), + ("VHHH", 22.3088888889, 113.914444444), + ("VHSK", 22.4363888889, 114.080277778), + ("VIAG", 27.1555555556, 77.9608333333), + ("VIAL", 25.4388888889, 81.7341666667), + ("VIAR", 31.7075, 74.7991666667), + ("VIBK", 28.0725, 73.2066666667), + ("VIBL", 26.9883333333, 80.8930555556), + ("VIBN", 25.4519444444, 82.8588888889), + ("VIBR", 31.8816666667, 77.1844444444), + ("VIBT", 30.27, 74.7555555556), + ("VIBW", 28.8375, 76.1775), + ("VIBY", 28.4222222222, 79.4497222222), + ("VICG", 30.6733333333, 76.7883333333), + ("VICX", 26.4041666667, 80.41), + ("VIDD", 28.5841666667, 77.2052777778), + ("VIDN", 30.1872222222, 78.18), + ("VIDP", 28.5663888889, 77.1030555556), + ("VIGN", 24.6544444444, 77.3472222222), + ("VIGR", 26.2938888889, 78.2275), + ("VIHR", 29.1805555556, 75.7530555556), + ("VIJN", 25.4897222222, 78.5594444444), + ("VIJO", 26.2513888889, 73.0480555556), + ("VIJP", 26.8238888889, 75.8097222222), + ("VIJR", 26.8891666667, 70.8644444444), + ("VIJU", 32.6897222222, 74.8380555556), + ("VIKA", 26.4411111111, 80.3633333333), + ("VIKO", 25.1605555556, 75.8447222222), + ("VILD", 30.8544444444, 75.9511111111), + ("VILH", 34.1355555556, 77.5455555556), + ("VILK", 26.7605555556, 80.8863888889), + ("VIPK", 32.2336111111, 75.6344444444), + ("VIPL", 30.315, 76.3633333333), + ("VIPT", 29.0330555556, 79.4736111111), + ("VIRB", 26.2502777778, 81.3805555556), + ("VISM", 31.0816666667, 77.0580555556), + ("VISP", 29.9941666667, 77.4241666667), + ("VISR", 33.9866666667, 74.7736111111), + ("VLHS", 20.2572222222, 100.437222222), + ("VLLB", 19.8972222222, 102.160833333), + ("VLPS", 15.1319444444, 105.781388889), + ("VLPV", 19.4547222222, 103.218055556), + ("VLSK", 16.5563888889, 104.759444444), + ("VLVT", 17.9880555556, 102.563055556), + ("VMMC", 22.1494444444, 113.591388889), + ("VNBW", 27.5055555556, 83.4161111111), + ("VNCG", 26.5705555556, 88.0794444444), + ("VNJP", 26.7086111111, 85.9222222222), + ("VNKT", 27.6963888889, 85.3591666667), + ("VNNG", 28.1036111111, 81.6669444444), + ("VNPK", 28.2002777778, 83.9811111111), + ("VNSI", 27.1594444444, 84.98), + ("VNVT", 26.4833333333, 87.2636111111), + ("VOAT", 10.8233333333, 72.1755555556), + ("VOBG", 12.9497222222, 77.6680555556), + ("VOBR", 17.9077777778, 77.4858333333), + ("VOBZ", 16.5302777778, 80.7966666667), + ("VOCB", 11.0313888889, 77.0438888889), + ("VOCL", 11.1355555556, 75.9547222222), + ("VOCP", 14.5097222222, 78.7727777778), + ("VOCX", 9.15305555556, 92.8191666667), + ("VODG", 17.6291666667, 78.4033333333), + ("VOHY", 17.4522222222, 78.4611111111), + ("VOMD", 9.83444444444, 78.0933333333), + ("VOML", 12.96, 74.8925), + ("VOMM", 12.9941666667, 80.1802777778), + ("VONS", 16.5408333333, 79.3177777778), + ("VOPB", 11.6455555556, 92.7330555556), + ("VORY", 17.1094444444, 81.8183333333), + ("VOSM", 11.7819444444, 78.0652777778), + ("VOTJ", 10.7197222222, 79.1036111111), + ("VOTP", 13.6319444444, 79.5430555556), + ("VOTR", 10.7652777778, 78.7088888889), + ("VOTV", 8.48194444444, 76.9180555556), + ("VOTX", 12.9066666667, 80.1211111111), + ("VOWA", 17.9180555556, 79.5986111111), + ("VQPR", 27.4030555556, 89.4258333333), + ("VRMM", 4.19166666667, 73.5288888889), + ("VTBD", 13.9125, 100.606666667), + ("VTBK", 14.1019444444, 99.9169444444), + ("VTBL", 14.8744444444, 100.663333333), + ("VTBU", 12.6797222222, 101.005), + ("VTBW", 13.7686111111, 102.315277778), + ("VTCB", 19.4972222222, 100.285555556), + ("VTCL", 18.2719444444, 99.5038888889), + ("VTCP", 18.1319444444, 100.164444444), + ("VTPH", 12.6338888889, 99.9508333333), + ("VTPI", 15.2772222222, 100.295833333), + ("VTPL", 16.8208333333, 101.253888889), + ("VTPM", 16.6997222222, 98.545), + ("VTPN", 15.6727777778, 100.136666667), + ("VTPP", 16.7827777778, 100.278888889), + ("VTPU", 17.6736111111, 100.234722222), + ("VTPY", 17.2341666667, 99.0577777778), + ("VTSC", 6.51972222222, 101.743333333), + ("VTSG", 8.09888888889, 98.9861111111), + ("VTSH", 7.18638888889, 100.607777778), + ("VTSK", 6.78527777778, 101.153333333), + ("VTSM", 9.54777777778, 100.062222222), + ("VTSN", 8.47111111111, 99.9555555556), + ("VTSP", 8.11305555556, 98.3166666667), + ("VTSR", 9.7775, 98.5852777778), + ("VTSS", 6.93305555556, 100.392777778), + ("VTST", 7.50861111111, 99.6163888889), + ("VTSY", 6.52666666667, 101.241944444), + ("VTUD", 17.3863888889, 102.788055556), + ("VTUI", 17.195, 104.118611111), + ("VTUJ", 14.8691666667, 103.488888889), + ("VTUL", 17.4388888889, 101.721944444), + ("VTUN", 14.9341666667, 102.078611111), + ("VTUP", 17.4125, 104.777222222), + ("VTUW", 17.3836111111, 104.642777778), + ("VVDN", 16.0438888889, 108.199166667), + ("VVNB", 21.2216666667, 105.805555556), + ("VVNT", 12.2180555556, 109.2), + ("VVTS", 10.82, 106.661666667), + ("VYBG", 21.1819444444, 94.9291666667), + ("VYBM", 24.2688888889, 97.2461111111), + ("VYCI", 14.1413888889, 93.3683333333), + ("VYDW", 14.0980555556, 98.2016666667), + ("VYHH", 20.7430555556, 96.7916666667), + ("VYKG", 21.3005555556, 99.6366666667), + ("VYKL", 23.1886111111, 94.0508333333), + ("VYKP", 19.4266666667, 93.5344444444), + ("VYKT", 10.0491666667, 98.5377777778), + ("VYLK", 19.6922222222, 97.2147222222), + ("VYLS", 22.9775, 97.7522222222), + ("VYLY", 20.9402777778, 94.8225), + ("VYMD", 21.7019444444, 95.9777777778), + ("VYME", 12.4433333333, 98.6211111111), + ("VYMK", 25.3825, 97.3527777778), + ("VYMM", 16.4447222222, 97.6605555556), + ("VYMO", 23.0925, 96.645), + ("VYMS", 20.5166666667, 99.2566666667), + ("VYNP", 25.3541666667, 97.295), + ("VYNS", 20.89, 97.7361111111), + ("VYPA", 16.8944444444, 97.6752777778), + ("VYPN", 16.8127777778, 94.7752777778), + ("VYPT", 27.3297222222, 97.4261111111), + ("VYPY", 18.8244444444, 95.2658333333), + ("VYST", 20.9416666667, 95.9144444444), + ("VYSW", 20.1325, 92.8725), + ("VYTD", 18.4605555556, 94.2994444444), + ("VYTL", 20.4836111111, 99.9352777778), + ("VYTO", 19.0311111111, 96.4013888889), + ("VYYY", 16.9072222222, 96.1330555556), + ("WAAA", -5.06166666667, 119.553888889), + ("WAAL", -4.31666666667, 122.466666667), + ("WAAM", -2.55777777778, 120.324166667), + ("WAAS", -2.52944444444, 121.357222222), + ("WAAT", -3.045, 119.821666667), + ("WAAU", -4.08222222222, 122.416666667), + ("WABB", -1.19, 136.107777778), + ("WABI", -3.36805555556, 135.496388889), + ("WABP", -4.52805555556, 136.887222222), + ("WAJJ", -2.57694444444, 140.516111111), + ("WAJW", -4.09611111111, 138.9525), + ("WAKK", -8.52027777778, 140.418333333), + ("WAMG", 0.636666666667, 122.851944444), + ("WAMH", 3.68305555556, 125.527777778), + ("WAML", -0.918333333333, 119.909444444), + ("WAMM", 1.54916666667, 124.926388889), + ("WAMP", -1.41666666667, 120.6575), + ("WAMT", 0.831944444444, 127.380555556), + ("WAMW", -1.03888888889, 122.771666667), + ("WAPL", -5.66138888889, 132.731388889), + ("WAPP", -3.70888888889, 128.09), + ("WASK", -3.64388888889, 133.695277778), + ("WASR", -0.88, 134.050277778), + ("WASS", -0.925833333333, 131.12), + ("WBGB", 3.17222222222, 113.044444444), + ("WBGG", 1.48472222222, 110.346388889), + ("WBGM", 4.17805555556, 114.331388889), + ("WBGR", 4.325, 113.988333333), + ("WBGS", 2.26388888889, 111.982777778), + ("WBKD", 5.03222222222, 118.323888889), + ("WBKK", 5.93722222222, 116.051111111), + ("WBKL", 5.30055555556, 115.25), + ("WBKW", 4.31333333333, 118.121944444), + ("WBSB", 4.94555555556, 114.927777778), + ("WIAA", 5.87388888889, 95.3394444444), + ("WIAM", -7.34555555556, 108.246388889), + ("WIAR", -7.61583333333, 111.433888889), + ("WIAS", -7.92611111111, 112.713888889), + ("WIBB", 0.461111111111, 101.444444444), + ("WIBD", 1.60916666667, 101.433333333), + ("WIIA", -6.29305555556, 106.569722222), + ("WIIB", -6.90055555556, 107.576111111), + ("WIIC", -6.75583333333, 108.539444444), + ("WIIH", -6.26638888889, 106.891111111), + ("WIII", -6.12555555556, 106.655833333), + ("WIIJ", -7.78805555556, 110.431944444), + ("WIIL", -7.645, 109.033888889), + ("WIIP", -6.33694444444, 106.764444444), + ("WIIS", -6.97305555556, 110.375277778), + ("WIIT", -5.24222222222, 105.178888889), + ("WIKB", 1.12083333333, 104.118611111), + ("WIKD", -2.74555555556, 107.754722222), + ("WIKK", -2.16277777778, 106.139166667), + ("WIKN", 0.9225, 104.532222222), + ("WIKS", -0.479166666667, 104.579166667), + ("WIMB", 1.16638888889, 97.7027777778), + ("WIME", 1.39916666667, 99.4319444444), + ("WIMG", -0.876111111111, 100.3525), + ("WIMM", 3.55805555556, 98.6716666667), + ("WIMS", 1.55472222222, 98.8902777778), + ("WIOG", -0.348611111111, 111.7475), + ("WIOK", -1.81638888889, 109.963333333), + ("WION", 3.90861111111, 108.387777778), + ("WIOO", -0.150555555556, 109.403888889), + ("WIOP", 0.835833333333, 112.935555556), + ("WIOS", 0.0636111111111, 111.474722222), + ("WIPA", -1.63777777778, 103.644166667), + ("WIPL", -3.86388888889, 102.340833333), + ("WIPP", -2.89777777778, 104.701111111), + ("WIPQ", -3.28583333333, 103.879444444), + ("WIPR", -0.352777777778, 102.334722222), + ("WIPU", -2.54222222222, 101.088333333), + ("WITL", 5.06944444444, 97.2591666667), + ("WITM", 5.22666666667, 96.9502777778), + ("WITT", 5.52333333333, 95.4202777778), + ("WMAP", 2.04138888889, 103.307222222), + ("WMBT", 2.81805555556, 104.16), + ("WMKA", 6.19388888889, 100.4025), + ("WMKB", 5.46583333333, 100.391111111), + ("WMKC", 6.16638888889, 102.293611111), + ("WMKD", 3.77527777778, 103.208888889), + ("WMKE", 4.53722222222, 103.426388889), + ("WMKF", 3.11222222222, 101.7025), + ("WMKI", 4.56777777778, 101.091944444), + ("WMKJ", 1.64111111111, 103.669444444), + ("WMKK", 2.74555555556, 101.709722222), + ("WMKL", 6.32972222222, 99.7286111111), + ("WMKM", 2.26333333333, 102.251388889), + ("WMKN", 5.3825, 103.103333333), + ("WMKP", 5.29694444444, 100.276666667), + ("WPDB", -9.30305555556, 125.286666667), + ("WPEC", -8.48527777778, 126.398888889), + ("WRBB", -3.44194444444, 114.761111111), + ("WRBC", -3.4125, 115.995555556), + ("WRBI", -2.705, 111.673055556), + ("WRBP", -2.225, 113.9425), + ("WRBS", -2.50111111111, 112.976944444), + ("WRKC", -8.64055555556, 122.236666667), + ("WRKE", -8.84888888889, 121.661944444), + ("WRKG", -8.59555555556, 120.4775), + ("WRKK", -10.1713888889, 123.671111111), + ("WRKO", -8.48611111111, 119.889166667), + ("WRLK", 2.15444444444, 117.432222222), + ("WRLL", -1.26805555556, 116.894444444), + ("WRLR", 3.32638888889, 117.566388889), + ("WRLS", -0.484444444444, 117.156944444), + ("WRLT", -0.0930555555556, 117.439166667), + ("WRRA", -8.56055555556, 116.094444444), + ("WRRB", -8.53944444444, 118.687222222), + ("WRRR", -8.74833333333, 115.167222222), + ("WRRS", -8.48888888889, 117.411944444), + ("WRRT", -9.40944444444, 119.246111111), + ("WRRW", -9.67, 120.303611111), + ("WRSJ", -7.37972222222, 112.786666667), + ("WRSQ", -7.51583333333, 110.756666667), + ("WSAG", 1.42361111111, 103.811388889), + ("WSAP", 1.36027777778, 103.909444444), + ("WSAT", 1.38722222222, 103.708611111), + ("WSSL", 1.41694444444, 103.8675), + ("WSSS", 1.35555555556, 103.987222222), + ("YBAF", -27.5702777778, 153.008055556), + ("YBAM", -10.9508333333, 142.459444444), + ("YBAS", -23.8069444444, 133.902222222), + ("YBBN", -27.3841666667, 153.1175), + ("YBCG", -28.1644444444, 153.504722222), + ("YBCS", -16.8858333333, 145.755277778), + ("YBCV", -26.4133333333, 146.2625), + ("YBMA", -20.6638888889, 139.488611111), + ("YBMC", -26.6033333333, 153.091111111), + ("YBMK", -21.1716666667, 149.179722222), + ("YBOK", -27.4113888889, 151.735277778), + ("YBPN", -20.495, 148.552222222), + ("YBRK", -23.3819444444, 150.475277778), + ("YBTL", -19.2525, 146.765277778), + ("YBWP", -12.6786111111, 141.925277778), + ("YMAV", -38.0394444444, 144.469444444), + ("YMAY", -36.0677777778, 146.958055556), + ("YMEN", -37.7280555556, 144.901944444), + ("YMES", -38.0988888889, 147.149444444), + ("YMHB", -42.8361111111, 147.510277778), + ("YMLT", -41.5452777778, 147.214166667), + ("YMMB", -37.9758333333, 145.102222222), + ("YMML", -37.6733333333, 144.843333333), + ("YMPC", -37.9322222222, 144.753333333), + ("YPAD", -34.945, 138.530555556), + ("YPAG", -32.5069444444, 137.716666667), + ("YPED", -34.7025, 138.620833333), + ("YPJT", -32.0972222222, 115.881111111), + ("YPKA", -20.7122222222, 116.773333333), + ("YPKG", -30.7894444444, 121.461666667), + ("YPKU", -15.7780555556, 128.7075), + ("YPLM", -22.2355555556, 114.088611111), + ("YPPD", -20.3777777778, 118.626388889), + ("YPPF", -34.7933333333, 138.633055556), + ("YPPH", -31.9402777778, 115.966944444), + ("YPWR", -31.1441666667, 136.816944444), + ("YPXM", -10.4505555556, 105.690277778), + ("YSBK", -33.9244444444, 150.988333333), + ("YSCB", -35.3083333333, 149.193888889), + ("YSCH", -30.3205555556, 153.116388889), + ("YSCN", -34.0402777778, 150.687222222), + ("YSDU", -32.2166666667, 148.574722222), + ("YSNF", -29.0413888889, 167.938611111), + ("YSRI", -33.6005555556, 150.780833333), + ("YSSY", -33.9461111111, 151.177222222), + ("YSTW", -31.0838888889, 150.846666667), + ("YSWG", -35.1652777778, 147.466388889), + ("ZBAA", 40.08, 116.584444444), + ("ZBHH", 40.8533333333, 111.821666667), + ("ZBLA", 49.205, 119.825), + ("ZBSJ", 38.2805555556, 114.696388889), + ("ZBTJ", 39.1238888889, 117.346111111), + ("ZBYN", 37.7466666667, 112.628611111), + ("ZGGG", 23.1841666667, 113.265833333), + ("ZGHA", 28.1888888889, 113.219444444), + ("ZGKL", 25.2177777778, 110.039166667), + ("ZGNN", 22.6080555556, 108.172222222), + ("ZGOW", 23.4, 116.683333333), + ("ZGSZ", 22.6394444444, 113.812222222), + ("ZHCC", 34.5194444444, 113.840833333), + ("ZHHH", 30.7836111111, 114.208055556), + ("ZHYC", 30.5522222222, 111.468611111), + ("ZKPY", 39.0333333333, 125.783333333), + ("ZLLL", 36.5166666667, 103.621666667), + ("ZLXY", 34.4458333333, 108.7525), + ("ZMUB", 47.8430555556, 106.766388889), + ("ZPJH", 21.975, 100.76), + ("ZPPP", 24.9922222222, 102.743333333), + ("ZSAM", 24.5438888889, 118.1275), + ("ZSCN", 28.6, 115.916666667), + ("ZSFZ", 25.9333333333, 119.661666667), + ("ZSHC", 30.2283333333, 120.431666667), + ("ZSNB", 29.8247222222, 121.465), + ("ZSNJ", 31.74, 118.86), + ("ZSOF", 31.78, 117.298333333), + ("ZSQD", 36.2625, 120.375277778), + ("ZSSS", 31.1977777778, 121.336111111), + ("ZSYT", 37.4016666667, 121.371666667), + ("ZUCK", 29.7188888889, 106.641388889), + ("ZUUU", 30.5783333333, 103.946944444), + ("ZUXC", 27.9886111111, 102.184166667), + ("ZWSH", 39.5433333333, 76.0216666667), + ("ZWTN", 37.0377777778, 79.8658333333), + ("ZWWW", 43.9069444444, 87.4741666667), + ("ZYHB", 45.6233333333, 126.250277778), + ("ZYJM", 46.8433333333, 130.465277778), + ("ZYMD", 44.5238888889, 129.568888889), + ("ZYTL", 38.9655555556, 121.538333333), + ("ZYYJ", 42.8816666667, 129.448333333) ) diff --git a/irc.py b/irc.py index 251ed64..69cfe44 100755 --- a/irc.py +++ b/irc.py @@ -10,197 +10,197 @@ http://inamidst.com/phenny/ import sys, re, time, traceback import socket, asyncore, asynchat -class Origin(object): - source = re.compile(r'([^!]*)!?([^@]*)@?(.*)') - - def __init__(self, bot, source, args): - match = Origin.source.match(source or '') - self.nick, self.user, self.host = match.groups() - - if len(args) > 1: - target = args[1] - else: target = None - - mappings = {bot.nick: self.nick, None: None} - self.sender = mappings.get(target, target) - -class Bot(asynchat.async_chat): - def __init__(self, nick, name, channels, password=None): - asynchat.async_chat.__init__(self) - self.set_terminator('\n') - self.buffer = '' - - self.nick = nick - self.user = nick - self.name = name - self.password = password - - self.verbose = True - self.channels = channels or [] - self.stack = [] - - import threading - self.sending = threading.RLock() - - def initiate_send(self): - self.sending.acquire() - asynchat.async_chat.initiate_send(self) - self.sending.release() - - # def push(self, *args, **kargs): - # asynchat.async_chat.push(self, *args, **kargs) - - def __write(self, args, text=None): - # print 'PUSH: %r %r %r' % (self, args, text) - try: - if text is not None: - # 510 because CR and LF count too, as nyuszika7h points out - self.push((' '.join(args) + ' :' + text)[:510] + '\r\n') - else: self.push(' '.join(args)[:510] + '\r\n') - except IndexError: - pass - - def write(self, args, text=None): - # This is a safe version of __write - def safe(input): - input = input.replace('\n', '') - input = input.replace('\r', '') - return input.encode('utf-8') - try: - args = [safe(arg) for arg in args] - if text is not None: - text = safe(text) - self.__write(args, text) - except Exception, e: pass - - def run(self, host, port=6667): - self.initiate_connect(host, port) - - def initiate_connect(self, host, port): - if self.verbose: - message = 'Connecting to %s:%s...' % (host, port) - print >> sys.stderr, message, - self.create_socket(socket.AF_INET, socket.SOCK_STREAM) - self.connect((host, port)) - try: asyncore.loop() - except KeyboardInterrupt: - sys.exit() - - def handle_connect(self): - if self.verbose: - print >> sys.stderr, 'connected!' - if self.password: - self.write(('PASS', self.password)) - self.write(('NICK', self.nick)) - self.write(('USER', self.user, '+iw', self.nick), self.name) - - def handle_close(self): - self.close() - print >> sys.stderr, 'Closed!' - - def collect_incoming_data(self, data): - self.buffer += data - - def found_terminator(self): - line = self.buffer - if line.endswith('\r'): - line = line[:-1] - self.buffer = '' - - # print 'GOT:', repr(line) - if line.startswith(':'): - source, line = line[1:].split(' ', 1) - else: source = None - - if ' :' in line: - argstr, text = line.split(' :', 1) - else: argstr, text = line, '' - args = argstr.split() - - origin = Origin(self, source, args) - self.dispatch(origin, tuple([text] + args)) - - if args[0] == 'PING': - self.write(('PONG', text)) - - def dispatch(self, origin, args): - pass - - def msg(self, recipient, text): - self.sending.acquire() - - # Cf. http://swhack.com/logs/2006-03-01#T19-43-25 - if isinstance(text, unicode): - try: text = text.encode('utf-8') - except UnicodeEncodeError, e: - text = e.__class__ + ': ' + str(e) - if isinstance(recipient, unicode): - try: recipient = recipient.encode('utf-8') - except UnicodeEncodeError, e: - return - - # No messages within the last 3 seconds? Go ahead! - # Otherwise, wait so it's been at least 0.8 seconds + penalty - if self.stack: - elapsed = time.time() - self.stack[-1][0] - if elapsed < 3: - penalty = float(max(0, len(text) - 50)) / 70 - wait = 0.8 + penalty - if elapsed < wait: - time.sleep(wait - elapsed) - - # Loop detection - messages = [m[1] for m in self.stack[-8:]] - if messages.count(text) >= 5: - text = '...' - if messages.count('...') >= 3: - self.sending.release() - return - - def safe(input): - input = input.replace('\n', '') - return input.replace('\r', '') - self.__write(('PRIVMSG', safe(recipient)), safe(text)) - self.stack.append((time.time(), text)) - self.stack = self.stack[-10:] - - self.sending.release() - - def notice(self, dest, text): - self.write(('NOTICE', dest), text) - - def error(self, origin): - try: - import traceback - trace = traceback.format_exc() - print trace - lines = list(reversed(trace.splitlines())) - - report = [lines[0].strip()] - for line in lines: - line = line.strip() - if line.startswith('File "/'): - report.append(line[0].lower() + line[1:]) - break - else: report.append('source unknown') - - self.msg(origin.sender, report[0] + ' (' + report[1] + ')') - except: self.msg(origin.sender, "Got an error.") - -class TestBot(Bot): - def f_ping(self, origin, match, args): - delay = m.group(1) - if delay is not None: - import time - time.sleep(int(delay)) - self.msg(origin.sender, 'pong (%s)' % delay) - else: self.msg(origin.sender, 'pong') - f_ping.rule = r'^\.ping(?:[ \t]+(\d+))?$' - -def main(): - # bot = TestBot('testbot', ['#d8uv.com']) - # bot.run('irc.freenode.net') - print __doc__ - -if __name__=="__main__": - main() +class Origin(object): + source = re.compile(r'([^!]*)!?([^@]*)@?(.*)') + + def __init__(self, bot, source, args): + match = Origin.source.match(source or '') + self.nick, self.user, self.host = match.groups() + + if len(args) > 1: + target = args[1] + else: target = None + + mappings = {bot.nick: self.nick, None: None} + self.sender = mappings.get(target, target) + +class Bot(asynchat.async_chat): + def __init__(self, nick, name, channels, password=None): + asynchat.async_chat.__init__(self) + self.set_terminator('\n') + self.buffer = '' + + self.nick = nick + self.user = nick + self.name = name + self.password = password + + self.verbose = True + self.channels = channels or [] + self.stack = [] + + import threading + self.sending = threading.RLock() + + def initiate_send(self): + self.sending.acquire() + asynchat.async_chat.initiate_send(self) + self.sending.release() + + # def push(self, *args, **kargs): + # asynchat.async_chat.push(self, *args, **kargs) + + def __write(self, args, text=None): + # print 'PUSH: %r %r %r' % (self, args, text) + try: + if text is not None: + # 510 because CR and LF count too, as nyuszika7h points out + self.push((' '.join(args) + ' :' + text)[:510] + '\r\n') + else: self.push(' '.join(args)[:510] + '\r\n') + except IndexError: + pass + + def write(self, args, text=None): + # This is a safe version of __write + def safe(input): + input = input.replace('\n', '') + input = input.replace('\r', '') + return input.encode('utf-8') + try: + args = [safe(arg) for arg in args] + if text is not None: + text = safe(text) + self.__write(args, text) + except Exception, e: pass + + def run(self, host, port=6667): + self.initiate_connect(host, port) + + def initiate_connect(self, host, port): + if self.verbose: + message = 'Connecting to %s:%s...' % (host, port) + print >> sys.stderr, message, + self.create_socket(socket.AF_INET, socket.SOCK_STREAM) + self.connect((host, port)) + try: asyncore.loop() + except KeyboardInterrupt: + sys.exit() + + def handle_connect(self): + if self.verbose: + print >> sys.stderr, 'connected!' + if self.password: + self.write(('PASS', self.password)) + self.write(('NICK', self.nick)) + self.write(('USER', self.user, '+iw', self.nick), self.name) + + def handle_close(self): + self.close() + print >> sys.stderr, 'Closed!' + + def collect_incoming_data(self, data): + self.buffer += data + + def found_terminator(self): + line = self.buffer + if line.endswith('\r'): + line = line[:-1] + self.buffer = '' + + # print 'GOT:', repr(line) + if line.startswith(':'): + source, line = line[1:].split(' ', 1) + else: source = None + + if ' :' in line: + argstr, text = line.split(' :', 1) + else: argstr, text = line, '' + args = argstr.split() + + origin = Origin(self, source, args) + self.dispatch(origin, tuple([text] + args)) + + if args[0] == 'PING': + self.write(('PONG', text)) + + def dispatch(self, origin, args): + pass + + def msg(self, recipient, text): + self.sending.acquire() + + # Cf. http://swhack.com/logs/2006-03-01#T19-43-25 + if isinstance(text, unicode): + try: text = text.encode('utf-8') + except UnicodeEncodeError, e: + text = e.__class__ + ': ' + str(e) + if isinstance(recipient, unicode): + try: recipient = recipient.encode('utf-8') + except UnicodeEncodeError, e: + return + + # No messages within the last 3 seconds? Go ahead! + # Otherwise, wait so it's been at least 0.8 seconds + penalty + if self.stack: + elapsed = time.time() - self.stack[-1][0] + if elapsed < 3: + penalty = float(max(0, len(text) - 50)) / 70 + wait = 0.8 + penalty + if elapsed < wait: + time.sleep(wait - elapsed) + + # Loop detection + messages = [m[1] for m in self.stack[-8:]] + if messages.count(text) >= 5: + text = '...' + if messages.count('...') >= 3: + self.sending.release() + return + + def safe(input): + input = input.replace('\n', '') + return input.replace('\r', '') + self.__write(('PRIVMSG', safe(recipient)), safe(text)) + self.stack.append((time.time(), text)) + self.stack = self.stack[-10:] + + self.sending.release() + + def notice(self, dest, text): + self.write(('NOTICE', dest), text) + + def error(self, origin): + try: + import traceback + trace = traceback.format_exc() + print trace + lines = list(reversed(trace.splitlines())) + + report = [lines[0].strip()] + for line in lines: + line = line.strip() + if line.startswith('File "/'): + report.append(line[0].lower() + line[1:]) + break + else: report.append('source unknown') + + self.msg(origin.sender, report[0] + ' (' + report[1] + ')') + except: self.msg(origin.sender, "Got an error.") + +class TestBot(Bot): + def f_ping(self, origin, match, args): + delay = m.group(1) + if delay is not None: + import time + time.sleep(int(delay)) + self.msg(origin.sender, 'pong (%s)' % delay) + else: self.msg(origin.sender, 'pong') + f_ping.rule = r'^\.ping(?:[ \t]+(\d+))?$' + +def main(): + # bot = TestBot('testbot', ['#d8uv.com']) + # bot.run('irc.freenode.net') + print __doc__ + +if __name__=="__main__": + main() diff --git a/modules/admin.py b/modules/admin.py index b42822a..93f8448 100755 --- a/modules/admin.py +++ b/modules/admin.py @@ -7,57 +7,57 @@ Licensed under the Eiffel Forum License 2. http://inamidst.com/phenny/ """ -def join(phenny, input): - """Join the specified channel. This is an admin-only command.""" - # Can only be done in privmsg by an admin - if input.sender.startswith('#'): return - if input.admin: - channel, key = input.group(1), input.group(2) - if not key: - phenny.write(['JOIN'], channel) - else: phenny.write(['JOIN', channel, key]) +def join(phenny, input): + """Join the specified channel. This is an admin-only command.""" + # Can only be done in privmsg by an admin + if input.sender.startswith('#'): return + if input.admin: + channel, key = input.group(1), input.group(2) + if not key: + phenny.write(['JOIN'], channel) + else: phenny.write(['JOIN', channel, key]) join.rule = r'\.join (#\S+)(?: *(\S+))?' join.priority = 'low' join.example = '.join #example or .join #example key' -def part(phenny, input): - """Part the specified channel. This is an admin-only command.""" - # Can only be done in privmsg by an admin - if input.sender.startswith('#'): return - if input.admin: - phenny.write(['PART'], input.group(2)) +def part(phenny, input): + """Part the specified channel. This is an admin-only command.""" + # Can only be done in privmsg by an admin + if input.sender.startswith('#'): return + if input.admin: + phenny.write(['PART'], input.group(2)) part.commands = ['part'] part.priority = 'low' part.example = '.part #example' -def quit(phenny, input): - """Quit from the server. This is an owner-only command.""" - # Can only be done in privmsg by the owner - if input.sender.startswith('#'): return - if input.owner: - phenny.write(['QUIT']) - __import__('os')._exit(0) +def quit(phenny, input): + """Quit from the server. This is an owner-only command.""" + # Can only be done in privmsg by the owner + if input.sender.startswith('#'): return + if input.owner: + phenny.write(['QUIT']) + __import__('os')._exit(0) quit.commands = ['quit'] quit.priority = 'low' -def msg(phenny, input): - # Can only be done in privmsg by an admin - if input.sender.startswith('#'): return - a, b = input.group(2), input.group(3) - if (not a) or (not b): return - if input.admin: - phenny.msg(a, b) +def msg(phenny, input): + # Can only be done in privmsg by an admin + if input.sender.startswith('#'): return + a, b = input.group(2), input.group(3) + if (not a) or (not b): return + if input.admin: + phenny.msg(a, b) msg.rule = (['msg'], r'(#?\S+) (.+)') msg.priority = 'low' -def me(phenny, input): - # Can only be done in privmsg by an admin - if input.sender.startswith('#'): return - if input.admin: - msg = '\x01ACTION %s\x01' % input.group(3) - phenny.msg(input.group(2) or input.sender, msg) +def me(phenny, input): + # Can only be done in privmsg by an admin + if input.sender.startswith('#'): return + if input.admin: + msg = '\x01ACTION %s\x01' % input.group(3) + phenny.msg(input.group(2) or input.sender, msg) me.rule = (['me'], r'(#?\S+) (.+)') me.priority = 'low' -if __name__ == '__main__': - print __doc__.strip() +if __name__ == '__main__': + print __doc__.strip() diff --git a/modules/calc.py b/modules/calc.py index 9a5b187..b58b730 100755 --- a/modules/calc.py +++ b/modules/calc.py @@ -15,101 +15,101 @@ r_result = re.compile(r'(?i)(.*?)') r_tag = re.compile(r'<\S+.*?>') subs = [ - (' in ', ' -> '), - (' over ', ' / '), - (u'£', 'GBP '), - (u'€', 'EUR '), - ('\$', 'USD '), - (r'\bKB\b', 'kilobytes'), - (r'\bMB\b', 'megabytes'), - (r'\bGB\b', 'kilobytes'), - ('kbps', '(kilobits / second)'), - ('mbps', '(megabits / second)') + (' in ', ' -> '), + (' over ', ' / '), + (u'£', 'GBP '), + (u'€', 'EUR '), + ('\$', 'USD '), + (r'\bKB\b', 'kilobytes'), + (r'\bMB\b', 'megabytes'), + (r'\bGB\b', 'kilobytes'), + ('kbps', '(kilobits / second)'), + ('mbps', '(megabits / second)') ] -def calc(phenny, input): - """Use the Frink online calculator.""" - q = input.group(2) - if not q: - return phenny.say('0?') +def calc(phenny, input): + """Use the Frink online calculator.""" + q = input.group(2) + if not q: + return phenny.say('0?') - query = q[:] - for a, b in subs: - query = re.sub(a, b, query) - query = query.rstrip(' \t') + query = q[:] + for a, b in subs: + query = re.sub(a, b, query) + query = query.rstrip(' \t') - precision = 5 - if query[-3:] in ('GBP', 'USD', 'EUR', 'NOK'): - precision = 2 - query = web.urllib.quote(query.encode('utf-8')) + precision = 5 + if query[-3:] in ('GBP', 'USD', 'EUR', 'NOK'): + precision = 2 + query = web.urllib.quote(query.encode('utf-8')) - uri = 'http://futureboy.us/fsp/frink.fsp?fromVal=' - bytes = web.get(uri + query) - m = r_result.search(bytes) - if m: - result = m.group(1) - result = r_tag.sub('', result) # strip span.warning tags - result = result.replace('>', '>') - result = result.replace('(undefined symbol)', '(?) ') + uri = 'http://futureboy.us/fsp/frink.fsp?fromVal=' + bytes = web.get(uri + query) + m = r_result.search(bytes) + if m: + result = m.group(1) + result = r_tag.sub('', result) # strip span.warning tags + result = result.replace('>', '>') + result = result.replace('(undefined symbol)', '(?) ') - if '.' in result: - try: result = str(round(float(result), precision)) - except ValueError: pass + if '.' in result: + try: result = str(round(float(result), precision)) + except ValueError: pass - if not result.strip(): - result = '?' - elif ' in ' in q: - result += ' ' + q.split(' in ', 1)[1] + if not result.strip(): + result = '?' + elif ' in ' in q: + result += ' ' + q.split(' in ', 1)[1] - phenny.say(q + ' = ' + result[:350]) - else: phenny.reply("Sorry, can't calculate that.") - phenny.say('Note that .calc is deprecated, consider using .c') + phenny.say(q + ' = ' + result[:350]) + else: phenny.reply("Sorry, can't calculate that.") + phenny.say('Note that .calc is deprecated, consider using .c') calc.commands = ['calc'] calc.example = '.calc 5 + 3' -def c(phenny, input): - """Google calculator.""" - if not input.group(2): - return phenny.reply("Nothing to calculate.") - q = input.group(2).encode('utf-8') - q = q.replace('\xcf\x95', 'phi') # utf-8 U+03D5 - q = q.replace('\xcf\x80', 'pi') # utf-8 U+03C0 - uri = 'http://www.google.com/ig/calculator?q=' - bytes = web.get(uri + web.urllib.quote(q)) - parts = bytes.split('",') - answer = [p for p in parts if p.startswith('rhs: "')][0][6:] - if answer: - answer = answer.decode('unicode-escape') - answer = ''.join(chr(ord(c)) for c in answer) - answer = answer.decode('utf-8') - answer = answer.replace(u'\xc2\xa0', ',') - answer = answer.replace('', '^(') - answer = answer.replace('', ')') - answer = web.decode(answer) - phenny.say(answer) - else: phenny.say('Sorry, no result.') +def c(phenny, input): + """Google calculator.""" + if not input.group(2): + return phenny.reply("Nothing to calculate.") + q = input.group(2).encode('utf-8') + q = q.replace('\xcf\x95', 'phi') # utf-8 U+03D5 + q = q.replace('\xcf\x80', 'pi') # utf-8 U+03C0 + uri = 'http://www.google.com/ig/calculator?q=' + bytes = web.get(uri + web.urllib.quote(q)) + parts = bytes.split('",') + answer = [p for p in parts if p.startswith('rhs: "')][0][6:] + if answer: + answer = answer.decode('unicode-escape') + answer = ''.join(chr(ord(c)) for c in answer) + answer = answer.decode('utf-8') + answer = answer.replace(u'\xc2\xa0', ',') + answer = answer.replace('', '^(') + answer = answer.replace('', ')') + answer = web.decode(answer) + phenny.say(answer) + else: phenny.say('Sorry, no result.') c.commands = ['c'] c.example = '.c 5 + 3' -def py(phenny, input): - query = input.group(2).encode('utf-8') - uri = 'http://tumbolia.appspot.com/py/' - answer = web.get(uri + web.urllib.quote(query)) - if answer: - phenny.say(answer) - else: phenny.reply('Sorry, no result.') +def py(phenny, input): + query = input.group(2).encode('utf-8') + uri = 'http://tumbolia.appspot.com/py/' + answer = web.get(uri + web.urllib.quote(query)) + if answer: + phenny.say(answer) + else: phenny.reply('Sorry, no result.') py.commands = ['py'] -def wa(phenny, input): - if not input.group(2): - return phenny.reply("No search term.") - query = input.group(2).encode('utf-8') - uri = 'http://tumbolia.appspot.com/wa/' - answer = web.get(uri + web.urllib.quote(query.replace('+', '%2B'))) - if answer: - phenny.say(answer) - else: phenny.reply('Sorry, no result.') +def wa(phenny, input): + if not input.group(2): + return phenny.reply("No search term.") + query = input.group(2).encode('utf-8') + uri = 'http://tumbolia.appspot.com/wa/' + answer = web.get(uri + web.urllib.quote(query.replace('+', '%2B'))) + if answer: + phenny.say(answer) + else: phenny.reply('Sorry, no result.') wa.commands = ['wa'] -if __name__ == '__main__': - print __doc__.strip() +if __name__ == '__main__': + print __doc__.strip() diff --git a/modules/clock.py b/modules/clock.py index 91f2d5b..e0c237c 100755 --- a/modules/clock.py +++ b/modules/clock.py @@ -11,180 +11,180 @@ import re, math, time, urllib, locale, socket, struct, datetime from decimal import Decimal as dec from tools import deprecated -TimeZones = {'KST': 9, 'CADT': 10.5, 'EETDST': 3, 'MESZ': 2, 'WADT': 9, - 'EET': 2, 'MST': -7, 'WAST': 8, 'IST': 5.5, 'B': 2, - 'MSK': 3, 'X': -11, 'MSD': 4, 'CETDST': 2, 'AST': -4, - 'HKT': 8, 'JST': 9, 'CAST': 9.5, 'CET': 1, 'CEST': 2, - 'EEST': 3, 'EAST': 10, 'METDST': 2, 'MDT': -6, 'A': 1, - 'UTC': 0, 'ADT': -3, 'EST': -5, 'E': 5, 'D': 4, 'G': 7, - 'F': 6, 'I': 9, 'H': 8, 'K': 10, 'PDT': -7, 'M': 12, - 'L': 11, 'O': -2, 'MEST': 2, 'Q': -4, 'P': -3, 'S': -6, - 'R': -5, 'U': -8, 'T': -7, 'W': -10, 'WET': 0, 'Y': -12, - 'CST': -6, 'EADT': 11, 'Z': 0, 'GMT': 0, 'WETDST': 1, - 'C': 3, 'WEST': 1, 'CDT': -5, 'MET': 1, 'N': -1, 'V': -9, - 'EDT': -4, 'UT': 0, 'PST': -8, 'MEZ': 1, 'BST': 1, - 'ACS': 9.5, 'ATL': -4, 'ALA': -9, 'HAW': -10, 'AKDT': -8, - 'AKST': -9, - 'BDST': 2} +TimeZones = {'KST': 9, 'CADT': 10.5, 'EETDST': 3, 'MESZ': 2, 'WADT': 9, + 'EET': 2, 'MST': -7, 'WAST': 8, 'IST': 5.5, 'B': 2, + 'MSK': 3, 'X': -11, 'MSD': 4, 'CETDST': 2, 'AST': -4, + 'HKT': 8, 'JST': 9, 'CAST': 9.5, 'CET': 1, 'CEST': 2, + 'EEST': 3, 'EAST': 10, 'METDST': 2, 'MDT': -6, 'A': 1, + 'UTC': 0, 'ADT': -3, 'EST': -5, 'E': 5, 'D': 4, 'G': 7, + 'F': 6, 'I': 9, 'H': 8, 'K': 10, 'PDT': -7, 'M': 12, + 'L': 11, 'O': -2, 'MEST': 2, 'Q': -4, 'P': -3, 'S': -6, + 'R': -5, 'U': -8, 'T': -7, 'W': -10, 'WET': 0, 'Y': -12, + 'CST': -6, 'EADT': 11, 'Z': 0, 'GMT': 0, 'WETDST': 1, + 'C': 3, 'WEST': 1, 'CDT': -5, 'MET': 1, 'N': -1, 'V': -9, + 'EDT': -4, 'UT': 0, 'PST': -8, 'MEZ': 1, 'BST': 1, + 'ACS': 9.5, 'ATL': -4, 'ALA': -9, 'HAW': -10, 'AKDT': -8, + 'AKST': -9, + 'BDST': 2} TZ1 = { - 'NDT': -2.5, - 'BRST': -2, - 'ADT': -3, - 'EDT': -4, - 'CDT': -5, - 'MDT': -6, - 'PDT': -7, - 'YDT': -8, - 'HDT': -9, - 'BST': 1, - 'MEST': 2, - 'SST': 2, - 'FST': 2, - 'CEST': 2, - 'EEST': 3, - 'WADT': 8, - 'KDT': 10, - 'EADT': 13, - 'NZD': 13, - 'NZDT': 13, - 'GMT': 0, - 'UT': 0, - 'UTC': 0, - 'WET': 0, - 'WAT': -1, - 'AT': -2, - 'FNT': -2, - 'BRT': -3, - 'MNT': -4, - 'EWT': -4, - 'AST': -4, - 'EST': -5, - 'ACT': -5, - 'CST': -6, - 'MST': -7, - 'PST': -8, - 'YST': -9, - 'HST': -10, - 'CAT': -10, - 'AHST': -10, - 'NT': -11, - 'IDLW': -12, - 'CET': 1, - 'MEZ': 1, - 'ECT': 1, - 'MET': 1, - 'MEWT': 1, - 'SWT': 1, - 'SET': 1, - 'FWT': 1, - 'EET': 2, - 'UKR': 2, - 'BT': 3, - 'ZP4': 4, - 'ZP5': 5, - 'ZP6': 6, - 'WST': 8, - 'HKT': 8, - 'CCT': 8, - 'JST': 9, - 'KST': 9, - 'EAST': 10, - 'GST': 10, - 'NZT': 12, - 'NZST': 12, + 'NDT': -2.5, + 'BRST': -2, + 'ADT': -3, + 'EDT': -4, + 'CDT': -5, + 'MDT': -6, + 'PDT': -7, + 'YDT': -8, + 'HDT': -9, + 'BST': 1, + 'MEST': 2, + 'SST': 2, + 'FST': 2, + 'CEST': 2, + 'EEST': 3, + 'WADT': 8, + 'KDT': 10, + 'EADT': 13, + 'NZD': 13, + 'NZDT': 13, + 'GMT': 0, + 'UT': 0, + 'UTC': 0, + 'WET': 0, + 'WAT': -1, + 'AT': -2, + 'FNT': -2, + 'BRT': -3, + 'MNT': -4, + 'EWT': -4, + 'AST': -4, + 'EST': -5, + 'ACT': -5, + 'CST': -6, + 'MST': -7, + 'PST': -8, + 'YST': -9, + 'HST': -10, + 'CAT': -10, + 'AHST': -10, + 'NT': -11, + 'IDLW': -12, + 'CET': 1, + 'MEZ': 1, + 'ECT': 1, + 'MET': 1, + 'MEWT': 1, + 'SWT': 1, + 'SET': 1, + 'FWT': 1, + 'EET': 2, + 'UKR': 2, + 'BT': 3, + 'ZP4': 4, + 'ZP5': 5, + 'ZP6': 6, + 'WST': 8, + 'HKT': 8, + 'CCT': 8, + 'JST': 9, + 'KST': 9, + 'EAST': 10, + 'GST': 10, + 'NZT': 12, + 'NZST': 12, 'IDLE': 12 } TZ2 = { - 'ACDT': 10.5, - 'ACST': 9.5, - 'ADT': 3, + 'ACDT': 10.5, + 'ACST': 9.5, + 'ADT': 3, 'AEDT': 11, # hmm 'AEST': 10, # hmm - 'AHDT': 9, - 'AHST': 10, - 'AST': 4, - 'AT': 2, - 'AWDT': -9, - 'AWST': -8, - 'BAT': -3, - 'BDST': -2, - 'BET': 11, - 'BST': -1, - 'BT': -3, - 'BZT2': 3, - 'CADT': -10.5, - 'CAST': -9.5, - 'CAT': 10, - 'CCT': -8, - # 'CDT': 5, - 'CED': -2, - 'CET': -1, - 'CST': 6, - 'EAST': -10, - # 'EDT': 4, - 'EED': -3, - 'EET': -2, - 'EEST': -3, - 'EST': 5, - 'FST': -2, - 'FWT': -1, - 'GMT': 0, - 'GST': -10, - 'HDT': 9, - 'HST': 10, - 'IDLE': -12, - 'IDLW': 12, - # 'IST': -5.5, - 'IT': -3.5, - 'JST': -9, - 'JT': -7, - 'KST': -9, - 'MDT': 6, - 'MED': -2, - 'MET': -1, - 'MEST': -2, - 'MEWT': -1, - 'MST': 7, - 'MT': -8, - 'NDT': 2.5, - 'NFT': 3.5, - 'NT': 11, - 'NST': -6.5, - 'NZ': -11, - 'NZST': -12, - 'NZDT': -13, - 'NZT': -12, - # 'PDT': 7, - 'PST': 8, - 'ROK': -9, - 'SAD': -10, - 'SAST': -9, - 'SAT': -9, - 'SDT': -10, - 'SST': -2, - 'SWT': -1, - 'USZ3': -4, - 'USZ4': -5, - 'USZ5': -6, - 'USZ6': -7, - 'UT': 0, - 'UTC': 0, - 'UZ10': -11, - 'WAT': 1, - 'WET': 0, - 'WST': -8, - 'YDT': 8, - 'YST': 9, - 'ZP4': -4, - 'ZP5': -5, + 'AHDT': 9, + 'AHST': 10, + 'AST': 4, + 'AT': 2, + 'AWDT': -9, + 'AWST': -8, + 'BAT': -3, + 'BDST': -2, + 'BET': 11, + 'BST': -1, + 'BT': -3, + 'BZT2': 3, + 'CADT': -10.5, + 'CAST': -9.5, + 'CAT': 10, + 'CCT': -8, + # 'CDT': 5, + 'CED': -2, + 'CET': -1, + 'CST': 6, + 'EAST': -10, + # 'EDT': 4, + 'EED': -3, + 'EET': -2, + 'EEST': -3, + 'EST': 5, + 'FST': -2, + 'FWT': -1, + 'GMT': 0, + 'GST': -10, + 'HDT': 9, + 'HST': 10, + 'IDLE': -12, + 'IDLW': 12, + # 'IST': -5.5, + 'IT': -3.5, + 'JST': -9, + 'JT': -7, + 'KST': -9, + 'MDT': 6, + 'MED': -2, + 'MET': -1, + 'MEST': -2, + 'MEWT': -1, + 'MST': 7, + 'MT': -8, + 'NDT': 2.5, + 'NFT': 3.5, + 'NT': 11, + 'NST': -6.5, + 'NZ': -11, + 'NZST': -12, + 'NZDT': -13, + 'NZT': -12, + # 'PDT': 7, + 'PST': 8, + 'ROK': -9, + 'SAD': -10, + 'SAST': -9, + 'SAT': -9, + 'SDT': -10, + 'SST': -2, + 'SWT': -1, + 'USZ3': -4, + 'USZ4': -5, + 'USZ5': -6, + 'USZ6': -7, + 'UT': 0, + 'UTC': 0, + 'UZ10': -11, + 'WAT': 1, + 'WET': 0, + 'WST': -8, + 'YDT': 8, + 'YST': 9, + 'ZP4': -4, + 'ZP5': -5, 'ZP6': -6 } TZ3 = { - 'AEST': 10, - 'AEDT': 11 + 'AEST': 10, + 'AEDT': 11 } # TimeZones.update(TZ2) # do these have to be negated? @@ -194,109 +194,109 @@ TimeZones.update(TZ3) r_local = re.compile(r'\([a-z]+_[A-Z]+\)') @deprecated -def f_time(self, origin, match, args): - """Returns the current time.""" - tz = match.group(2) or 'GMT' +def f_time(self, origin, match, args): + """Returns the current time.""" + tz = match.group(2) or 'GMT' - # Personal time zones, because they're rad - if hasattr(self.config, 'timezones'): - People = self.config.timezones - else: People = {} + # Personal time zones, because they're rad + if hasattr(self.config, 'timezones'): + People = self.config.timezones + else: People = {} - if People.has_key(tz): - tz = People[tz] - elif (not match.group(2)) and People.has_key(origin.nick): - tz = People[origin.nick] + if People.has_key(tz): + tz = People[tz] + elif (not match.group(2)) and People.has_key(origin.nick): + tz = People[origin.nick] - TZ = tz.upper() - if len(tz) > 30: return + TZ = tz.upper() + if len(tz) > 30: return - if (TZ == 'UTC') or (TZ == 'Z'): - msg = time.strftime('%Y-%m-%dT%H:%M:%SZ', time.gmtime()) - self.msg(origin.sender, msg) - elif r_local.match(tz): # thanks to Mark Shoulsdon (clsn) - locale.setlocale(locale.LC_TIME, (tz[1:-1], 'UTF-8')) - msg = time.strftime("%A, %d %B %Y %H:%M:%SZ", time.gmtime()) - self.msg(origin.sender, msg) - elif TimeZones.has_key(TZ): - offset = TimeZones[TZ] * 3600 - timenow = time.gmtime(time.time() + offset) - msg = time.strftime("%a, %d %b %Y %H:%M:%S " + str(TZ), timenow) - self.msg(origin.sender, msg) - elif tz and tz[0] in ('+', '-') and 4 <= len(tz) <= 6: - timenow = time.gmtime(time.time() + (int(tz[:3]) * 3600)) - msg = time.strftime("%a, %d %b %Y %H:%M:%S " + str(tz), timenow) - self.msg(origin.sender, msg) - else: - try: t = float(tz) - except ValueError: - import os, re, subprocess - r_tz = re.compile(r'^[A-Za-z]+(?:/[A-Za-z_]+)*$') - if r_tz.match(tz) and os.path.isfile('/usr/share/zoneinfo/' + tz): - cmd, PIPE = 'TZ=%s date' % tz, subprocess.PIPE - proc = subprocess.Popen(cmd, shell=True, stdout=PIPE) - self.msg(origin.sender, proc.communicate()[0]) - else: - error = "Sorry, I don't know about the '%s' timezone." % tz - self.msg(origin.sender, origin.nick + ': ' + error) - else: - timenow = time.gmtime(time.time() + (t * 3600)) - msg = time.strftime("%a, %d %b %Y %H:%M:%S " + str(tz), timenow) - self.msg(origin.sender, msg) + if (TZ == 'UTC') or (TZ == 'Z'): + msg = time.strftime('%Y-%m-%dT%H:%M:%SZ', time.gmtime()) + self.msg(origin.sender, msg) + elif r_local.match(tz): # thanks to Mark Shoulsdon (clsn) + locale.setlocale(locale.LC_TIME, (tz[1:-1], 'UTF-8')) + msg = time.strftime("%A, %d %B %Y %H:%M:%SZ", time.gmtime()) + self.msg(origin.sender, msg) + elif TimeZones.has_key(TZ): + offset = TimeZones[TZ] * 3600 + timenow = time.gmtime(time.time() + offset) + msg = time.strftime("%a, %d %b %Y %H:%M:%S " + str(TZ), timenow) + self.msg(origin.sender, msg) + elif tz and tz[0] in ('+', '-') and 4 <= len(tz) <= 6: + timenow = time.gmtime(time.time() + (int(tz[:3]) * 3600)) + msg = time.strftime("%a, %d %b %Y %H:%M:%S " + str(tz), timenow) + self.msg(origin.sender, msg) + else: + try: t = float(tz) + except ValueError: + import os, re, subprocess + r_tz = re.compile(r'^[A-Za-z]+(?:/[A-Za-z_]+)*$') + if r_tz.match(tz) and os.path.isfile('/usr/share/zoneinfo/' + tz): + cmd, PIPE = 'TZ=%s date' % tz, subprocess.PIPE + proc = subprocess.Popen(cmd, shell=True, stdout=PIPE) + self.msg(origin.sender, proc.communicate()[0]) + else: + error = "Sorry, I don't know about the '%s' timezone." % tz + self.msg(origin.sender, origin.nick + ': ' + error) + else: + timenow = time.gmtime(time.time() + (t * 3600)) + msg = time.strftime("%a, %d %b %Y %H:%M:%S " + str(tz), timenow) + self.msg(origin.sender, msg) f_time.commands = ['t'] f_time.name = 't' f_time.example = '.t UTC' -def beats(phenny, input): - """Shows the internet time in Swatch beats.""" - beats = ((time.time() + 3600) % 86400) / 86.4 - beats = int(math.floor(beats)) - phenny.say('@%03i' % beats) +def beats(phenny, input): + """Shows the internet time in Swatch beats.""" + beats = ((time.time() + 3600) % 86400) / 86.4 + beats = int(math.floor(beats)) + phenny.say('@%03i' % beats) beats.commands = ['beats'] beats.priority = 'low' -def divide(input, by): - return (input / by), (input % by) +def divide(input, by): + return (input / by), (input % by) -def yi(phenny, input): - """Shows whether it is currently yi or not.""" - quadraels, remainder = divide(int(time.time()), 1753200) - raels = quadraels * 4 - extraraels, remainder = divide(remainder, 432000) - if extraraels == 4: - return phenny.say('Yes! PARTAI!') - else: phenny.say('Not yet...') +def yi(phenny, input): + """Shows whether it is currently yi or not.""" + quadraels, remainder = divide(int(time.time()), 1753200) + raels = quadraels * 4 + extraraels, remainder = divide(remainder, 432000) + if extraraels == 4: + return phenny.say('Yes! PARTAI!') + else: phenny.say('Not yet...') yi.commands = ['yi'] yi.priority = 'low' -def tock(phenny, input): - """Shows the time from the USNO's atomic clock.""" - u = urllib.urlopen('http://tycho.usno.navy.mil/cgi-bin/timer.pl') - info = u.info() - u.close() - phenny.say('"' + info['Date'] + '" - tycho.usno.navy.mil') +def tock(phenny, input): + """Shows the time from the USNO's atomic clock.""" + u = urllib.urlopen('http://tycho.usno.navy.mil/cgi-bin/timer.pl') + info = u.info() + u.close() + phenny.say('"' + info['Date'] + '" - tycho.usno.navy.mil') tock.commands = ['tock'] tock.priority = 'high' -def npl(phenny, input): - """Shows the time from NPL's SNTP server.""" - # for server in ('ntp1.npl.co.uk', 'ntp2.npl.co.uk'): - client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) - client.sendto('\x1b' + 47 * '\0', ('ntp1.npl.co.uk', 123)) - data, address = client.recvfrom(1024) - if data: - buf = struct.unpack('B' * 48, data) - d = dec('0.0') - for i in range(8): - d += dec(buf[32 + i]) * dec(str(math.pow(2, (3 - i) * 8))) - d -= dec(2208988800L) - a, b = str(d).split('.') - f = '%Y-%m-%d %H:%M:%S' - result = datetime.datetime.fromtimestamp(d).strftime(f) + '.' + b[:6] - phenny.say(result + ' - ntp1.npl.co.uk') - else: phenny.say('No data received, sorry') +def npl(phenny, input): + """Shows the time from NPL's SNTP server.""" + # for server in ('ntp1.npl.co.uk', 'ntp2.npl.co.uk'): + client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + client.sendto('\x1b' + 47 * '\0', ('ntp1.npl.co.uk', 123)) + data, address = client.recvfrom(1024) + if data: + buf = struct.unpack('B' * 48, data) + d = dec('0.0') + for i in range(8): + d += dec(buf[32 + i]) * dec(str(math.pow(2, (3 - i) * 8))) + d -= dec(2208988800L) + a, b = str(d).split('.') + f = '%Y-%m-%d %H:%M:%S' + result = datetime.datetime.fromtimestamp(d).strftime(f) + '.' + b[:6] + phenny.say(result + ' - ntp1.npl.co.uk') + else: phenny.say('No data received, sorry') npl.commands = ['npl'] npl.priority = 'high' -if __name__ == '__main__': - print __doc__.strip() +if __name__ == '__main__': + print __doc__.strip() diff --git a/modules/codepoints.py b/modules/codepoints.py index eb9c8bf..a83d292 100755 --- a/modules/codepoints.py +++ b/modules/codepoints.py @@ -10,125 +10,125 @@ http://inamidst.com/phenny/ import re, unicodedata from itertools import islice -def about(u, cp=None, name=None): - if cp is None: - cp = ord(u) - if name is None: - try: name = unicodedata.name(u) - except ValueError: - return 'U+%04X (No name found)' % cp - - if not unicodedata.combining(u): - template = 'U+%04X %s (%s)' - else: template = 'U+%04X %s (\xe2\x97\x8c%s)' - return template % (cp, name, u.encode('utf-8')) - -def codepoint_simple(arg): - arg = arg.upper() - - r_label = re.compile('\\b' + arg.replace(' ', '.*\\b') + '\\b') - - results = [] - for cp in xrange(0xFFFF): - u = unichr(cp) - try: name = unicodedata.name(u) - except ValueError: continue - - if r_label.search(name): - results.append((len(name), u, cp, name)) - if not results: - r_label = re.compile('\\b' + arg.replace(' ', '.*\\b')) - for cp in xrange(0xFFFF): - u = unichr(cp) - try: name = unicodedata.name(u) - except ValueError: continue - - if r_label.search(name): +def about(u, cp=None, name=None): + if cp is None: + cp = ord(u) + if name is None: + try: name = unicodedata.name(u) + except ValueError: + return 'U+%04X (No name found)' % cp + + if not unicodedata.combining(u): + template = 'U+%04X %s (%s)' + else: template = 'U+%04X %s (\xe2\x97\x8c%s)' + return template % (cp, name, u.encode('utf-8')) + +def codepoint_simple(arg): + arg = arg.upper() + + r_label = re.compile('\\b' + arg.replace(' ', '.*\\b') + '\\b') + + results = [] + for cp in xrange(0xFFFF): + u = unichr(cp) + try: name = unicodedata.name(u) + except ValueError: continue + + if r_label.search(name): results.append((len(name), u, cp, name)) - - if not results: - return None - - length, u, cp, name = sorted(results)[0] - return about(u, cp, name) - -def codepoint_extended(arg): - arg = arg.upper() - try: r_search = re.compile(arg) - except: raise ValueError('Broken regexp: %r' % arg) - - for cp in xrange(1, 0x10FFFF): - u = unichr(cp) - name = unicodedata.name(u, '-') - - if r_search.search(name): - yield about(u, cp, name) - -def u(phenny, input): - """Look up unicode information.""" - arg = input.bytes[3:] - # phenny.msg('#inamidst', '%r' % arg) - if not arg: - return phenny.reply('You gave me zero length input.') - elif not arg.strip(' '): - if len(arg) > 1: return phenny.reply('%s SPACEs (U+0020)' % len(arg)) - return phenny.reply('1 SPACE (U+0020)') - - # @@ space - if set(arg.upper()) - set( - 'ABCDEFGHIJKLMNOPQRSTUVWYXYZ0123456789- .?+*{}[]\\/^$'): - printable = False - elif len(arg) > 1: - printable = True - else: printable = False - - if printable: - extended = False - for c in '.?+*{}[]\\/^$': - if c in arg: - extended = True - break - - if len(arg) == 4: - try: u = unichr(int(arg, 16)) - except ValueError: pass - else: return phenny.say(about(u)) - - if extended: - # look up a codepoint with regexp - results = list(islice(codepoint_extended(arg), 4)) - for i, result in enumerate(results): - if (i < 2) or ((i == 2) and (len(results) < 4)): - phenny.say(result) - elif (i == 2) and (len(results) > 3): - phenny.say(result + ' [...]') - if not results: - phenny.reply('Sorry, no results') - else: - # look up a codepoint freely - result = codepoint_simple(arg) - if result is not None: - phenny.say(result) - else: phenny.reply("Sorry, no results for %r." % arg) - else: - text = arg.decode('utf-8') - # look up less than three podecoints - if len(text) <= 3: - for u in text: - phenny.say(about(u)) - # look up more than three podecoints - elif len(text) <= 10: - phenny.reply(' '.join('U+%04X' % ord(c) for c in text)) - else: phenny.reply('Sorry, your input is too long!') + if not results: + r_label = re.compile('\\b' + arg.replace(' ', '.*\\b')) + for cp in xrange(0xFFFF): + u = unichr(cp) + try: name = unicodedata.name(u) + except ValueError: continue + + if r_label.search(name): + results.append((len(name), u, cp, name)) + + if not results: + return None + + length, u, cp, name = sorted(results)[0] + return about(u, cp, name) + +def codepoint_extended(arg): + arg = arg.upper() + try: r_search = re.compile(arg) + except: raise ValueError('Broken regexp: %r' % arg) + + for cp in xrange(1, 0x10FFFF): + u = unichr(cp) + name = unicodedata.name(u, '-') + + if r_search.search(name): + yield about(u, cp, name) + +def u(phenny, input): + """Look up unicode information.""" + arg = input.bytes[3:] + # phenny.msg('#inamidst', '%r' % arg) + if not arg: + return phenny.reply('You gave me zero length input.') + elif not arg.strip(' '): + if len(arg) > 1: return phenny.reply('%s SPACEs (U+0020)' % len(arg)) + return phenny.reply('1 SPACE (U+0020)') + + # @@ space + if set(arg.upper()) - set( + 'ABCDEFGHIJKLMNOPQRSTUVWYXYZ0123456789- .?+*{}[]\\/^$'): + printable = False + elif len(arg) > 1: + printable = True + else: printable = False + + if printable: + extended = False + for c in '.?+*{}[]\\/^$': + if c in arg: + extended = True + break + + if len(arg) == 4: + try: u = unichr(int(arg, 16)) + except ValueError: pass + else: return phenny.say(about(u)) + + if extended: + # look up a codepoint with regexp + results = list(islice(codepoint_extended(arg), 4)) + for i, result in enumerate(results): + if (i < 2) or ((i == 2) and (len(results) < 4)): + phenny.say(result) + elif (i == 2) and (len(results) > 3): + phenny.say(result + ' [...]') + if not results: + phenny.reply('Sorry, no results') + else: + # look up a codepoint freely + result = codepoint_simple(arg) + if result is not None: + phenny.say(result) + else: phenny.reply("Sorry, no results for %r." % arg) + else: + text = arg.decode('utf-8') + # look up less than three podecoints + if len(text) <= 3: + for u in text: + phenny.say(about(u)) + # look up more than three podecoints + elif len(text) <= 10: + phenny.reply(' '.join('U+%04X' % ord(c) for c in text)) + else: phenny.reply('Sorry, your input is too long!') u.commands = ['u'] u.example = '.u 203D' -def bytes(phenny, input): - """Show the input as pretty printed bytes.""" - b = input.bytes - phenny.reply('%r' % b[b.find(' ') + 1:]) +def bytes(phenny, input): + """Show the input as pretty printed bytes.""" + b = input.bytes + phenny.reply('%r' % b[b.find(' ') + 1:]) bytes.commands = ['bytes'] bytes.example = '.bytes \xe3\x8b\xa1' -if __name__ == '__main__': - print __doc__.strip() +if __name__ == '__main__': + print __doc__.strip() diff --git a/modules/etymology.py b/modules/etymology.py index cc93cfe..9edd218 100755 --- a/modules/etymology.py +++ b/modules/etymology.py @@ -19,96 +19,96 @@ r_definition = re.compile(r'(?ims)]*>.*?') r_tag = re.compile(r'<(?!!)[^>]+>') r_whitespace = re.compile(r'[\t\r\n ]+') -class Grab(urllib.URLopener): - def __init__(self, *args): - self.version = 'Mozilla/5.0 (Phenny)' - urllib.URLopener.__init__(self, *args) - def http_error_default(self, url, fp, errcode, errmsg, headers): - return urllib.addinfourl(fp, [headers, errcode], "http:" + url) +class Grab(urllib.URLopener): + def __init__(self, *args): + self.version = 'Mozilla/5.0 (Phenny)' + urllib.URLopener.__init__(self, *args) + def http_error_default(self, url, fp, errcode, errmsg, headers): + return urllib.addinfourl(fp, [headers, errcode], "http:" + url) abbrs = [ - 'cf', 'lit', 'etc', 'Ger', 'Du', 'Skt', 'Rus', 'Eng', 'Amer.Eng', 'Sp', - 'Fr', 'N', 'E', 'S', 'W', 'L', 'Gen', 'J.C', 'dial', 'Gk', - '19c', '18c', '17c', '16c', 'St', 'Capt', 'obs', 'Jan', 'Feb', 'Mar', - 'Apr', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec', 'c', 'tr', 'e', 'g' + 'cf', 'lit', 'etc', 'Ger', 'Du', 'Skt', 'Rus', 'Eng', 'Amer.Eng', 'Sp', + 'Fr', 'N', 'E', 'S', 'W', 'L', 'Gen', 'J.C', 'dial', 'Gk', + '19c', '18c', '17c', '16c', 'St', 'Capt', 'obs', 'Jan', 'Feb', 'Mar', + 'Apr', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec', 'c', 'tr', 'e', 'g' ] t_sentence = r'^.*?(?') - s = s.replace('<', '<') - s = s.replace('&', '&') - return s - -def text(html): - html = r_tag.sub('', html) - html = r_whitespace.sub(' ', html) - return unescape(html).strip() - -def etymology(word): - # @@ sbp, would it be possible to have a flag for .ety to get 2nd/etc - # entries? - http://swhack.com/logs/2006-07-19#T15-05-29 - - if len(word) > 25: - raise ValueError("Word too long: %s[...]" % word[:10]) - word = {'axe': 'ax/axe'}.get(word, word) - - grab = urllib._urlopener - urllib._urlopener = Grab() - urllib._urlopener.addheader("Referer", "http://www.etymonline.com/") - bytes = web.get(etyuri % web.urllib.quote(word)) - urllib._urlopener = grab - definitions = r_definition.findall(bytes) - - if not definitions: - return None - - defn = text(definitions[0]) - m = r_sentence.match(defn) - if not m: - return None - sentence = m.group(0) - - # try: - # sentence = unicode(sentence, 'iso-8859-1') - # sentence = sentence.encode('utf-8') - # except: pass - sentence = web.decode(sentence) - - maxlength = 275 - if len(sentence) > maxlength: - sentence = sentence[:maxlength] - words = sentence[:-5].split(' ') - words.pop() - sentence = ' '.join(words) + ' [...]' - - sentence = '"' + sentence.replace('"', "'") + '"' - return sentence + ' - ' + ('http://etymonline.com/index.php?term=%s' % web.urllib.quote(word)) +def unescape(s): + s = s.replace('>', '>') + s = s.replace('<', '<') + s = s.replace('&', '&') + return s + +def text(html): + html = r_tag.sub('', html) + html = r_whitespace.sub(' ', html) + return unescape(html).strip() + +def etymology(word): + # @@ sbp, would it be possible to have a flag for .ety to get 2nd/etc + # entries? - http://swhack.com/logs/2006-07-19#T15-05-29 + + if len(word) > 25: + raise ValueError("Word too long: %s[...]" % word[:10]) + word = {'axe': 'ax/axe'}.get(word, word) + + grab = urllib._urlopener + urllib._urlopener = Grab() + urllib._urlopener.addheader("Referer", "http://www.etymonline.com/") + bytes = web.get(etyuri % web.urllib.quote(word)) + urllib._urlopener = grab + definitions = r_definition.findall(bytes) + + if not definitions: + return None + + defn = text(definitions[0]) + m = r_sentence.match(defn) + if not m: + return None + sentence = m.group(0) + + # try: + # sentence = unicode(sentence, 'iso-8859-1') + # sentence = sentence.encode('utf-8') + # except: pass + sentence = web.decode(sentence) + + maxlength = 275 + if len(sentence) > maxlength: + sentence = sentence[:maxlength] + words = sentence[:-5].split(' ') + words.pop() + sentence = ' '.join(words) + ' [...]' + + sentence = '"' + sentence.replace('"', "'") + '"' + return sentence + ' - ' + ('http://etymonline.com/index.php?term=%s' % web.urllib.quote(word)) @deprecated -def f_etymology(self, origin, match, args): - word = match.group(2) - - try: result = etymology(word.encode('iso-8859-1')) - except IOError: - msg = "Can't connect to etymonline.com (%s)" % (etyuri % word) - self.msg(origin.sender, msg) - return - except AttributeError: - result = None - - if result is not None: - self.msg(origin.sender, result) - else: - uri = etysearch % word - msg = 'Can\'t find the etymology for "%s". Try %s' % (word, ('http://etymonline.com/index.php?term=%s' % web.urllib.quote(word))) - self.msg(origin.sender, msg) +def f_etymology(self, origin, match, args): + word = match.group(2) + + try: result = etymology(word.encode('iso-8859-1')) + except IOError: + msg = "Can't connect to etymonline.com (%s)" % (etyuri % word) + self.msg(origin.sender, msg) + return + except AttributeError: + result = None + + if result is not None: + self.msg(origin.sender, result) + else: + uri = etysearch % word + msg = 'Can\'t find the etymology for "%s". Try %s' % (word, ('http://etymonline.com/index.php?term=%s' % web.urllib.quote(word))) + self.msg(origin.sender, msg) # @@ Cf. http://swhack.com/logs/2006-01-04#T01-50-22 f_etymology.rule = (['ety'], r"(.+?)$") f_etymology.thread = True f_etymology.priority = 'high' -if __name__=="__main__": - import sys - print etymology(sys.argv[1]) +if __name__=="__main__": + import sys + print etymology(sys.argv[1]) diff --git a/modules/head.py b/modules/head.py index 66e9eef..939ac3c 100755 --- a/modules/head.py +++ b/modules/head.py @@ -12,56 +12,56 @@ from htmlentitydefs import name2codepoint import web from tools import deprecated -def head(phenny, input): - """Provide HTTP HEAD information.""" - uri = input.group(2) - uri = (uri or '').encode('utf-8') - if ' ' in uri: - uri, header = uri.rsplit(' ', 1) - else: uri, header = uri, None - - if not uri and hasattr(phenny, 'last_seen_uri'): - try: uri = phenny.last_seen_uri[input.sender] - except KeyError: return phenny.say('?') - - if not uri.startswith('htt'): - uri = 'http://' + uri - # uri = uri.replace('#!', '?_escaped_fragment_=') - - try: info = web.head(uri) - except IOError: return phenny.say("Can't connect to %s" % uri) - except httplib.InvalidURL: return phenny.say("Not a valid URI, sorry.") - - if not isinstance(info, list): - try: info = dict(info) - except TypeError: - return phenny.reply('Try .head http://example.org/ [optional header]') - info['Status'] = '200' - else: - newInfo = dict(info[0]) - newInfo['Status'] = str(info[1]) - info = newInfo - - if header is None: - data = [] - if info.has_key('Status'): - data.append(info['Status']) - if info.has_key('content-type'): - data.append(info['content-type'].replace('; charset=', ', ')) - if info.has_key('last-modified'): - modified = info['last-modified'] - modified = time.strptime(modified, '%a, %d %b %Y %H:%M:%S %Z') - data.append(time.strftime('%Y-%m-%d %H:%M:%S UTC', modified)) - if info.has_key('content-length'): - data.append(info['content-length'] + ' bytes') - phenny.reply(', '.join(data)) - else: - headerlower = header.lower() - if info.has_key(headerlower): - phenny.say(header + ': ' + info.get(headerlower)) - else: - msg = 'There was no %s header in the response.' % header - phenny.say(msg) +def head(phenny, input): + """Provide HTTP HEAD information.""" + uri = input.group(2) + uri = (uri or '').encode('utf-8') + if ' ' in uri: + uri, header = uri.rsplit(' ', 1) + else: uri, header = uri, None + + if not uri and hasattr(phenny, 'last_seen_uri'): + try: uri = phenny.last_seen_uri[input.sender] + except KeyError: return phenny.say('?') + + if not uri.startswith('htt'): + uri = 'http://' + uri + # uri = uri.replace('#!', '?_escaped_fragment_=') + + try: info = web.head(uri) + except IOError: return phenny.say("Can't connect to %s" % uri) + except httplib.InvalidURL: return phenny.say("Not a valid URI, sorry.") + + if not isinstance(info, list): + try: info = dict(info) + except TypeError: + return phenny.reply('Try .head http://example.org/ [optional header]') + info['Status'] = '200' + else: + newInfo = dict(info[0]) + newInfo['Status'] = str(info[1]) + info = newInfo + + if header is None: + data = [] + if info.has_key('Status'): + data.append(info['Status']) + if info.has_key('content-type'): + data.append(info['content-type'].replace('; charset=', ', ')) + if info.has_key('last-modified'): + modified = info['last-modified'] + modified = time.strptime(modified, '%a, %d %b %Y %H:%M:%S %Z') + data.append(time.strftime('%Y-%m-%d %H:%M:%S UTC', modified)) + if info.has_key('content-length'): + data.append(info['content-length'] + ' bytes') + phenny.reply(', '.join(data)) + else: + headerlower = header.lower() + if info.has_key(headerlower): + phenny.say(header + ': ' + info.get(headerlower)) + else: + msg = 'There was no %s header in the response.' % header + phenny.say(msg) head.commands = ['head'] head.example = '.head http://www.w3.org/' @@ -69,121 +69,121 @@ r_title = re.compile(r'(?ims)]*>(.*?)') r_entity = re.compile(r'&[A-Za-z0-9#]+;') @deprecated -def f_title(self, origin, match, args): - """.title - Return the title of URI.""" - uri = match.group(2) - uri = (uri or '').encode('utf-8') - - if not uri and hasattr(self, 'last_seen_uri'): - uri = self.last_seen_uri.get(origin.sender) - if not uri: - return self.msg(origin.sender, 'I need a URI to give the title of...') - - if not ':' in uri: - uri = 'http://' + uri - uri = uri.replace('#!', '?_escaped_fragment_=') - - localhost = [ - 'http://localhost/', 'http://localhost:80/', - 'http://localhost:8080/', 'http://127.0.0.1/', - 'http://127.0.0.1:80/', 'http://127.0.0.1:8080/', - 'https://localhost/', 'https://localhost:80/', - 'https://localhost:8080/', 'https://127.0.0.1/', - 'https://127.0.0.1:80/', 'https://127.0.0.1:8080/', - ] - for s in localhost: - if uri.startswith(s): - return phenny.reply('Sorry, access forbidden.') - - try: - redirects = 0 - while True: - headers = { - 'Accept': 'text/html', - 'User-Agent': 'Mozilla/5.0 (Phenny)' - } - req = urllib2.Request(uri, headers=headers) - u = urllib2.urlopen(req) - info = u.info() - u.close() - # info = web.head(uri) - - if not isinstance(info, list): - status = '200' - else: - status = str(info[1]) - info = info[0] - if status.startswith('3'): - uri = urlparse.urljoin(uri, info['Location']) - else: break - - redirects += 1 - if redirects >= 25: - self.msg(origin.sender, origin.nick + ": Too many redirects") +def f_title(self, origin, match, args): + """.title - Return the title of URI.""" + uri = match.group(2) + uri = (uri or '').encode('utf-8') + + if not uri and hasattr(self, 'last_seen_uri'): + uri = self.last_seen_uri.get(origin.sender) + if not uri: + return self.msg(origin.sender, 'I need a URI to give the title of...') + + if not ':' in uri: + uri = 'http://' + uri + uri = uri.replace('#!', '?_escaped_fragment_=') + + localhost = [ + 'http://localhost/', 'http://localhost:80/', + 'http://localhost:8080/', 'http://127.0.0.1/', + 'http://127.0.0.1:80/', 'http://127.0.0.1:8080/', + 'https://localhost/', 'https://localhost:80/', + 'https://localhost:8080/', 'https://127.0.0.1/', + 'https://127.0.0.1:80/', 'https://127.0.0.1:8080/', + ] + for s in localhost: + if uri.startswith(s): + return phenny.reply('Sorry, access forbidden.') + + try: + redirects = 0 + while True: + headers = { + 'Accept': 'text/html', + 'User-Agent': 'Mozilla/5.0 (Phenny)' + } + req = urllib2.Request(uri, headers=headers) + u = urllib2.urlopen(req) + info = u.info() + u.close() + # info = web.head(uri) + + if not isinstance(info, list): + status = '200' + else: + status = str(info[1]) + info = info[0] + if status.startswith('3'): + uri = urlparse.urljoin(uri, info['Location']) + else: break + + redirects += 1 + if redirects >= 25: + self.msg(origin.sender, origin.nick + ": Too many redirects") + return + + try: mtype = info['content-type'] + except: + err = ": Couldn't get the Content-Type, sorry" + return self.msg(origin.sender, origin.nick + err) + if not (('/html' in mtype) or ('/xhtml' in mtype)): + self.msg(origin.sender, origin.nick + ": Document isn't HTML") return - try: mtype = info['content-type'] - except: - err = ": Couldn't get the Content-Type, sorry" - return self.msg(origin.sender, origin.nick + err) - if not (('/html' in mtype) or ('/xhtml' in mtype)): - self.msg(origin.sender, origin.nick + ": Document isn't HTML") - return - - u = urllib2.urlopen(req) - bytes = u.read(262144) - u.close() - - except IOError: - self.msg(origin.sender, "Can't connect to %s" % uri) - return - - m = r_title.search(bytes) - if m: - title = m.group(1) - title = title.strip() - title = title.replace('\t', ' ') - title = title.replace('\r', ' ') - title = title.replace('\n', ' ') - while ' ' in title: - title = title.replace(' ', ' ') - if len(title) > 200: - title = title[:200] + '[...]' - - def e(m): - entity = m.group(0) - if entity.startswith('&#x'): - cp = int(entity[3:-1], 16) - return unichr(cp).encode('utf-8') - elif entity.startswith('&#'): - cp = int(entity[2:-1]) - return unichr(cp).encode('utf-8') - else: - char = name2codepoint[entity[1:-1]] - return unichr(char).encode('utf-8') - title = r_entity.sub(e, title) - - if title: - try: title.decode('utf-8') - except: - try: title = title.decode('iso-8859-1').encode('utf-8') - except: title = title.decode('cp1252').encode('utf-8') - else: pass - else: title = '[The title is empty.]' - - title = title.replace('\n', '') - title = title.replace('\r', '') - self.msg(origin.sender, origin.nick + ': ' + title) - else: self.msg(origin.sender, origin.nick + ': No title found') + u = urllib2.urlopen(req) + bytes = u.read(262144) + u.close() + + except IOError: + self.msg(origin.sender, "Can't connect to %s" % uri) + return + + m = r_title.search(bytes) + if m: + title = m.group(1) + title = title.strip() + title = title.replace('\t', ' ') + title = title.replace('\r', ' ') + title = title.replace('\n', ' ') + while ' ' in title: + title = title.replace(' ', ' ') + if len(title) > 200: + title = title[:200] + '[...]' + + def e(m): + entity = m.group(0) + if entity.startswith('&#x'): + cp = int(entity[3:-1], 16) + return unichr(cp).encode('utf-8') + elif entity.startswith('&#'): + cp = int(entity[2:-1]) + return unichr(cp).encode('utf-8') + else: + char = name2codepoint[entity[1:-1]] + return unichr(char).encode('utf-8') + title = r_entity.sub(e, title) + + if title: + try: title.decode('utf-8') + except: + try: title = title.decode('iso-8859-1').encode('utf-8') + except: title = title.decode('cp1252').encode('utf-8') + else: pass + else: title = '[The title is empty.]' + + title = title.replace('\n', '') + title = title.replace('\r', '') + self.msg(origin.sender, origin.nick + ': ' + title) + else: self.msg(origin.sender, origin.nick + ': No title found') f_title.commands = ['title'] -def noteuri(phenny, input): - uri = input.group(1).encode('utf-8') - if not hasattr(phenny.bot, 'last_seen_uri'): - phenny.bot.last_seen_uri = {} - phenny.bot.last_seen_uri[input.sender] = uri +def noteuri(phenny, input): + uri = input.group(1).encode('utf-8') + if not hasattr(phenny.bot, 'last_seen_uri'): + phenny.bot.last_seen_uri = {} + phenny.bot.last_seen_uri[input.sender] = uri noteuri.rule = r'.*(http[s]?://[^<> "\x01]+)[,.]?' noteuri.priority = 'low' -if __name__ == '__main__': - print __doc__.strip() +if __name__ == '__main__': + print __doc__.strip() diff --git a/modules/info.py b/modules/info.py index dbf2d44..1e41864 100755 --- a/modules/info.py +++ b/modules/info.py @@ -7,83 +7,83 @@ Licensed under the Eiffel Forum License 2. http://inamidst.com/phenny/ """ -def doc(phenny, input): - """Shows a command's documentation, and possibly an example.""" - name = input.group(1) - name = name.lower() +def doc(phenny, input): + """Shows a command's documentation, and possibly an example.""" + name = input.group(1) + name = name.lower() - if phenny.doc.has_key(name): - phenny.reply(phenny.doc[name][0]) - if phenny.doc[name][1]: - phenny.say('e.g. ' + phenny.doc[name][1]) + if phenny.doc.has_key(name): + phenny.reply(phenny.doc[name][0]) + if phenny.doc[name][1]: + phenny.say('e.g. ' + phenny.doc[name][1]) doc.rule = ('$nick', '(?i)(?:help|doc) +([A-Za-z]+)(?:\?+)?$') doc.example = '$nickname: doc tell?' doc.priority = 'low' -def commands(phenny, input): - # This function only works in private message - if input.sender.startswith('#'): return - names = ', '.join(sorted(phenny.doc.iterkeys())) - phenny.say('Commands I recognise: ' + names + '.') - phenny.say(("For help, do '%s: help example?' where example is the " + - "name of the command you want help for.") % phenny.nick) +def commands(phenny, input): + # This function only works in private message + if input.sender.startswith('#'): return + names = ', '.join(sorted(phenny.doc.iterkeys())) + phenny.say('Commands I recognise: ' + names + '.') + phenny.say(("For help, do '%s: help example?' where example is the " + + "name of the command you want help for.") % phenny.nick) commands.commands = ['commands'] commands.priority = 'low' -def help(phenny, input): - response = ( - 'Hi, I\'m a bot. Say ".commands" to me in private for a list ' + - 'of my commands, or see http://inamidst.com/phenny/ for more ' + - 'general details. My owner is %s.' - ) % phenny.config.owner - phenny.reply(response) +def help(phenny, input): + response = ( + 'Hi, I\'m a bot. Say ".commands" to me in private for a list ' + + 'of my commands, or see http://inamidst.com/phenny/ for more ' + + 'general details. My owner is %s.' + ) % phenny.config.owner + phenny.reply(response) help.rule = ('$nick', r'(?i)help(?:[?!]+)?$') help.priority = 'low' -def stats(phenny, input): - """Show information on command usage patterns.""" - commands = {} - users = {} - channels = {} +def stats(phenny, input): + """Show information on command usage patterns.""" + commands = {} + users = {} + channels = {} - ignore = set(['f_note', 'startup', 'message', 'noteuri']) - for (name, user), count in phenny.stats.items(): - if name in ignore: continue - if not user: continue + ignore = set(['f_note', 'startup', 'message', 'noteuri']) + for (name, user), count in phenny.stats.items(): + if name in ignore: continue + if not user: continue - if not user.startswith('#'): - try: users[user] += count - except KeyError: users[user] = count - else: - try: commands[name] += count - except KeyError: commands[name] = count + if not user.startswith('#'): + try: users[user] += count + except KeyError: users[user] = count + else: + try: commands[name] += count + except KeyError: commands[name] = count - try: channels[user] += count - except KeyError: channels[user] = count + try: channels[user] += count + except KeyError: channels[user] = count - comrank = sorted([(b, a) for (a, b) in commands.iteritems()], reverse=True) - userank = sorted([(b, a) for (a, b) in users.iteritems()], reverse=True) - charank = sorted([(b, a) for (a, b) in channels.iteritems()], reverse=True) + comrank = sorted([(b, a) for (a, b) in commands.iteritems()], reverse=True) + userank = sorted([(b, a) for (a, b) in users.iteritems()], reverse=True) + charank = sorted([(b, a) for (a, b) in channels.iteritems()], reverse=True) - # most heavily used commands - creply = 'most used commands: ' - for count, command in comrank[:10]: - creply += '%s (%s), ' % (command, count) - phenny.say(creply.rstrip(', ')) + # most heavily used commands + creply = 'most used commands: ' + for count, command in comrank[:10]: + creply += '%s (%s), ' % (command, count) + phenny.say(creply.rstrip(', ')) - # most heavy users - reply = 'power users: ' - for count, user in userank[:10]: - reply += '%s (%s), ' % (user, count) - phenny.say(reply.rstrip(', ')) + # most heavy users + reply = 'power users: ' + for count, user in userank[:10]: + reply += '%s (%s), ' % (user, count) + phenny.say(reply.rstrip(', ')) - # most heavy channels - chreply = 'power channels: ' - for count, channel in charank[:3]: - chreply += '%s (%s), ' % (channel, count) - phenny.say(chreply.rstrip(', ')) + # most heavy channels + chreply = 'power channels: ' + for count, channel in charank[:3]: + chreply += '%s (%s), ' % (channel, count) + phenny.say(chreply.rstrip(', ')) stats.commands = ['stats'] stats.priority = 'low' -if __name__ == '__main__': - print __doc__.strip() +if __name__ == '__main__': + print __doc__.strip() diff --git a/modules/oblique.py b/modules/oblique.py index d93446e..3a5f35a 100755 --- a/modules/oblique.py +++ b/modules/oblique.py @@ -15,105 +15,105 @@ definitions = 'https://github.com/nslater/oblique/wiki' r_item = re.compile(r'(?i)
  • (.*?)
  • ') r_tag = re.compile(r'<[^>]+>') -def mappings(uri): - result = {} - bytes = web.get(uri) - for item in r_item.findall(bytes): - item = r_tag.sub('', item).strip(' \t\r\n') - if not ' ' in item: continue - - command, template = item.split(' ', 1) - if not command.isalnum(): continue - if not template.startswith('http://'): continue - result[command] = template.replace('&', '&') - return result - -def service(phenny, input, command, args): - t = o.services[command] - template = t.replace('${args}', urllib.quote(args.encode('utf-8'), '')) - template = template.replace('${nick}', urllib.quote(input.nick, '')) - uri = template.replace('${sender}', urllib.quote(input.sender, '')) - - info = web.head(uri) - if isinstance(info, list): - info = info[0] - if not 'text/plain' in info.get('content-type', '').lower(): - return phenny.reply("Sorry, the service didn't respond in plain text.") - bytes = web.get(uri) - lines = bytes.splitlines() - if not lines: - return phenny.reply("Sorry, the service didn't respond any output.") - try: line = lines[0].encode('utf-8')[:350] - except: line = lines[0][:250] - phenny.say(line) - -def refresh(phenny): - if hasattr(phenny.config, 'services'): - services = phenny.config.services - else: services = definitions - - old = o.services - o.serviceURI = services - o.services = mappings(o.serviceURI) - return len(o.services), set(o.services) - set(old) - -def o(phenny, input): - """Call a webservice.""" - text = input.group(2) - - if (not o.services) or (text == 'refresh'): - length, added = refresh(phenny) - if text == 'refresh': - msg = 'Okay, found %s services.' % length - if added: - msg += ' Added: ' + ', '.join(sorted(added)[:5]) - if len(added) > 5: msg += ', &c.' - return phenny.reply(msg) - - if not text: - return phenny.reply('Try %s for details.' % o.serviceURI) - - if ' ' in text: - command, args = text.split(' ', 1) - else: command, args = text, '' - command = command.lower() - - if command == 'service': - msg = o.services.get(args, 'No such service!') - return phenny.reply(msg) - - if not o.services.has_key(command): - return phenny.reply('Service not found in %s' % o.serviceURI) - - if hasattr(phenny.config, 'external'): - default = phenny.config.external.get('*') - manifest = phenny.config.external.get(input.sender, default) - if manifest: - commands = set(manifest) - if (command not in commands) and (manifest[0] != '!'): - return phenny.reply('Sorry, %s is not whitelisted' % command) - elif (command in commands) and (manifest[0] == '!'): - return phenny.reply('Sorry, %s is blacklisted' % command) - service(phenny, input, command, args) +def mappings(uri): + result = {} + bytes = web.get(uri) + for item in r_item.findall(bytes): + item = r_tag.sub('', item).strip(' \t\r\n') + if not ' ' in item: continue + + command, template = item.split(' ', 1) + if not command.isalnum(): continue + if not template.startswith('http://'): continue + result[command] = template.replace('&', '&') + return result + +def service(phenny, input, command, args): + t = o.services[command] + template = t.replace('${args}', urllib.quote(args.encode('utf-8'), '')) + template = template.replace('${nick}', urllib.quote(input.nick, '')) + uri = template.replace('${sender}', urllib.quote(input.sender, '')) + + info = web.head(uri) + if isinstance(info, list): + info = info[0] + if not 'text/plain' in info.get('content-type', '').lower(): + return phenny.reply("Sorry, the service didn't respond in plain text.") + bytes = web.get(uri) + lines = bytes.splitlines() + if not lines: + return phenny.reply("Sorry, the service didn't respond any output.") + try: line = lines[0].encode('utf-8')[:350] + except: line = lines[0][:250] + phenny.say(line) + +def refresh(phenny): + if hasattr(phenny.config, 'services'): + services = phenny.config.services + else: services = definitions + + old = o.services + o.serviceURI = services + o.services = mappings(o.serviceURI) + return len(o.services), set(o.services) - set(old) + +def o(phenny, input): + """Call a webservice.""" + text = input.group(2) + + if (not o.services) or (text == 'refresh'): + length, added = refresh(phenny) + if text == 'refresh': + msg = 'Okay, found %s services.' % length + if added: + msg += ' Added: ' + ', '.join(sorted(added)[:5]) + if len(added) > 5: msg += ', &c.' + return phenny.reply(msg) + + if not text: + return phenny.reply('Try %s for details.' % o.serviceURI) + + if ' ' in text: + command, args = text.split(' ', 1) + else: command, args = text, '' + command = command.lower() + + if command == 'service': + msg = o.services.get(args, 'No such service!') + return phenny.reply(msg) + + if not o.services.has_key(command): + return phenny.reply('Service not found in %s' % o.serviceURI) + + if hasattr(phenny.config, 'external'): + default = phenny.config.external.get('*') + manifest = phenny.config.external.get(input.sender, default) + if manifest: + commands = set(manifest) + if (command not in commands) and (manifest[0] != '!'): + return phenny.reply('Sorry, %s is not whitelisted' % command) + elif (command in commands) and (manifest[0] == '!'): + return phenny.reply('Sorry, %s is blacklisted' % command) + service(phenny, input, command, args) o.commands = ['o'] o.example = '.o servicename arg1 arg2 arg3' o.services = {} o.serviceURI = None -def snippet(phenny, input): - if not o.services: - refresh(phenny) - - search = urllib.quote(input.group(2).encode('utf-8')) - py = "BeautifulSoup.BeautifulSoup(re.sub('<.*?>|(?<= ) +', '', " + \ - "''.join(chr(ord(c)) for c in " + \ - "eval(urllib.urlopen('http://ajax.googleapis.com/ajax/serv" + \ - "ices/search/web?v=1.0&q=" + search + "').read()" + \ - ".replace('null', 'None'))['responseData']['resul" + \ - "ts'][0]['content'].decode('unicode-escape')).replace(" + \ - "'"', '\x22')), convertEntities=True)" - service(phenny, input, 'py', py) +def snippet(phenny, input): + if not o.services: + refresh(phenny) + + search = urllib.quote(input.group(2).encode('utf-8')) + py = "BeautifulSoup.BeautifulSoup(re.sub('<.*?>|(?<= ) +', '', " + \ + "''.join(chr(ord(c)) for c in " + \ + "eval(urllib.urlopen('http://ajax.googleapis.com/ajax/serv" + \ + "ices/search/web?v=1.0&q=" + search + "').read()" + \ + ".replace('null', 'None'))['responseData']['resul" + \ + "ts'][0]['content'].decode('unicode-escape')).replace(" + \ + "'"', '\x22')), convertEntities=True)" + service(phenny, input, 'py', py) snippet.commands = ['snippet'] -if __name__ == '__main__': - print __doc__.strip() +if __name__ == '__main__': + print __doc__.strip() diff --git a/modules/ping.py b/modules/ping.py index 23219ac..9ce7429 100755 --- a/modules/ping.py +++ b/modules/ping.py @@ -7,17 +7,17 @@ About: http://inamidst.com/phenny/ import random -def hello(phenny, input): - greeting = random.choice(('Hi', 'Hey', 'Hello')) - punctuation = random.choice(('', '!')) - phenny.say(greeting + ' ' + input.nick + punctuation) +def hello(phenny, input): + greeting = random.choice(('Hi', 'Hey', 'Hello')) + punctuation = random.choice(('', '!')) + phenny.say(greeting + ' ' + input.nick + punctuation) hello.rule = r'(?i)(hi|hello|hey) $nickname[ \t]*$' -def interjection(phenny, input): - phenny.say(input.nick + '!') +def interjection(phenny, input): + phenny.say(input.nick + '!') interjection.rule = r'$nickname!' interjection.priority = 'high' interjection.thread = False -if __name__ == '__main__': - print __doc__.strip() +if __name__ == '__main__': + print __doc__.strip() diff --git a/modules/reload.py b/modules/reload.py index dfd0e8e..bef2f19 100755 --- a/modules/reload.py +++ b/modules/reload.py @@ -10,46 +10,46 @@ http://inamidst.com/phenny/ import sys, os.path, time, imp import irc -def f_reload(phenny, input): - """Reloads a module, for use by admins only.""" - if not input.admin: return - - name = input.group(2) - if name == phenny.config.owner: - return phenny.reply('What?') - - if (not name) or (name == '*'): - phenny.variables = None - phenny.commands = None - phenny.setup() - return phenny.reply('done') - - if not sys.modules.has_key(name): - return phenny.reply('%s: no such module!' % name) - - # Thanks to moot for prodding me on this - path = sys.modules[name].__file__ - if path.endswith('.pyc') or path.endswith('.pyo'): - path = path[:-1] - if not os.path.isfile(path): - return phenny.reply('Found %s, but not the source file' % name) - - module = imp.load_source(name, path) - sys.modules[name] = module - if hasattr(module, 'setup'): - module.setup(phenny) - - mtime = os.path.getmtime(module.__file__) - modified = time.strftime('%Y-%m-%d %H:%M:%S', time.gmtime(mtime)) - - phenny.register(vars(module)) - phenny.bind_commands() - - phenny.reply('%r (version: %s)' % (module, modified)) +def f_reload(phenny, input): + """Reloads a module, for use by admins only.""" + if not input.admin: return + + name = input.group(2) + if name == phenny.config.owner: + return phenny.reply('What?') + + if (not name) or (name == '*'): + phenny.variables = None + phenny.commands = None + phenny.setup() + return phenny.reply('done') + + if not sys.modules.has_key(name): + return phenny.reply('%s: no such module!' % name) + + # Thanks to moot for prodding me on this + path = sys.modules[name].__file__ + if path.endswith('.pyc') or path.endswith('.pyo'): + path = path[:-1] + if not os.path.isfile(path): + return phenny.reply('Found %s, but not the source file' % name) + + module = imp.load_source(name, path) + sys.modules[name] = module + if hasattr(module, 'setup'): + module.setup(phenny) + + mtime = os.path.getmtime(module.__file__) + modified = time.strftime('%Y-%m-%d %H:%M:%S', time.gmtime(mtime)) + + phenny.register(vars(module)) + phenny.bind_commands() + + phenny.reply('%r (version: %s)' % (module, modified)) f_reload.name = 'reload' f_reload.rule = ('$nick', ['reload'], r'(\S+)?') f_reload.priority = 'low' f_reload.thread = False -if __name__ == '__main__': - print __doc__.strip() +if __name__ == '__main__': + print __doc__.strip() diff --git a/modules/remind.py b/modules/remind.py index fbfd258..871d585 100755 --- a/modules/remind.py +++ b/modules/remind.py @@ -9,133 +9,133 @@ http://inamidst.com/phenny/ import os, re, time, threading -def filename(self): - name = self.nick + '-' + self.config.host + '.reminders.db' - return os.path.join(os.path.expanduser('~/.phenny'), name) - -def load_database(name): - data = {} - if os.path.isfile(name): - f = open(name, 'rb') - for line in f: - unixtime, channel, nick, message = line.split('\t') - message = message.rstrip('\n') - t = int(unixtime) - reminder = (channel, nick, message) - try: data[t].append(reminder) - except KeyError: data[t] = [reminder] - f.close() - return data - -def dump_database(name, data): - f = open(name, 'wb') - for unixtime, reminders in data.iteritems(): - for channel, nick, message in reminders: - f.write('%s\t%s\t%s\t%s\n' % (unixtime, channel, nick, message)) - f.close() - -def setup(phenny): - phenny.rfn = filename(phenny) - - # phenny.sending.acquire() - phenny.rdb = load_database(phenny.rfn) - # phenny.sending.release() - - def monitor(phenny): - time.sleep(5) - while True: - now = int(time.time()) - unixtimes = [int(key) for key in phenny.rdb] - oldtimes = [t for t in unixtimes if t <= now] - if oldtimes: - for oldtime in oldtimes: - for (channel, nick, message) in phenny.rdb[oldtime]: - if message: - phenny.msg(channel, nick + ': ' + message) - else: phenny.msg(channel, nick + '!') - del phenny.rdb[oldtime] - - # phenny.sending.acquire() - dump_database(phenny.rfn, phenny.rdb) - # phenny.sending.release() - time.sleep(2.5) - - targs = (phenny,) - t = threading.Thread(target=monitor, args=targs) - t.start() +def filename(self): + name = self.nick + '-' + self.config.host + '.reminders.db' + return os.path.join(os.path.expanduser('~/.phenny'), name) + +def load_database(name): + data = {} + if os.path.isfile(name): + f = open(name, 'rb') + for line in f: + unixtime, channel, nick, message = line.split('\t') + message = message.rstrip('\n') + t = int(unixtime) + reminder = (channel, nick, message) + try: data[t].append(reminder) + except KeyError: data[t] = [reminder] + f.close() + return data + +def dump_database(name, data): + f = open(name, 'wb') + for unixtime, reminders in data.iteritems(): + for channel, nick, message in reminders: + f.write('%s\t%s\t%s\t%s\n' % (unixtime, channel, nick, message)) + f.close() + +def setup(phenny): + phenny.rfn = filename(phenny) + + # phenny.sending.acquire() + phenny.rdb = load_database(phenny.rfn) + # phenny.sending.release() + + def monitor(phenny): + time.sleep(5) + while True: + now = int(time.time()) + unixtimes = [int(key) for key in phenny.rdb] + oldtimes = [t for t in unixtimes if t <= now] + if oldtimes: + for oldtime in oldtimes: + for (channel, nick, message) in phenny.rdb[oldtime]: + if message: + phenny.msg(channel, nick + ': ' + message) + else: phenny.msg(channel, nick + '!') + del phenny.rdb[oldtime] + + # phenny.sending.acquire() + dump_database(phenny.rfn, phenny.rdb) + # phenny.sending.release() + time.sleep(2.5) + + targs = (phenny,) + t = threading.Thread(target=monitor, args=targs) + t.start() scaling = { - 'years': 365.25 * 24 * 3600, - 'year': 365.25 * 24 * 3600, - 'yrs': 365.25 * 24 * 3600, - 'y': 365.25 * 24 * 3600, - - 'months': 29.53059 * 24 * 3600, - 'month': 29.53059 * 24 * 3600, - 'mo': 29.53059 * 24 * 3600, - - 'weeks': 7 * 24 * 3600, - 'week': 7 * 24 * 3600, - 'wks': 7 * 24 * 3600, - 'wk': 7 * 24 * 3600, - 'w': 7 * 24 * 3600, - - 'days': 24 * 3600, - 'day': 24 * 3600, - 'd': 24 * 3600, - - 'hours': 3600, - 'hour': 3600, - 'hrs': 3600, - 'hr': 3600, - 'h': 3600, - - 'minutes': 60, - 'minute': 60, - 'mins': 60, - 'min': 60, - 'm': 60, - - 'seconds': 1, - 'second': 1, - 'secs': 1, - 'sec': 1, - 's': 1 + 'years': 365.25 * 24 * 3600, + 'year': 365.25 * 24 * 3600, + 'yrs': 365.25 * 24 * 3600, + 'y': 365.25 * 24 * 3600, + + 'months': 29.53059 * 24 * 3600, + 'month': 29.53059 * 24 * 3600, + 'mo': 29.53059 * 24 * 3600, + + 'weeks': 7 * 24 * 3600, + 'week': 7 * 24 * 3600, + 'wks': 7 * 24 * 3600, + 'wk': 7 * 24 * 3600, + 'w': 7 * 24 * 3600, + + 'days': 24 * 3600, + 'day': 24 * 3600, + 'd': 24 * 3600, + + 'hours': 3600, + 'hour': 3600, + 'hrs': 3600, + 'hr': 3600, + 'h': 3600, + + 'minutes': 60, + 'minute': 60, + 'mins': 60, + 'min': 60, + 'm': 60, + + 'seconds': 1, + 'second': 1, + 'secs': 1, + 'sec': 1, + 's': 1 } periods = '|'.join(scaling.keys()) p_command = r'\.in ([0-9]+(?:\.[0-9]+)?)\s?((?:%s)\b)?:?\s?(.*)' % periods r_command = re.compile(p_command) -def remind(phenny, input): - m = r_command.match(input.bytes) - if not m: - return phenny.reply("Sorry, didn't understand the input.") - length, scale, message = m.groups() +def remind(phenny, input): + m = r_command.match(input.bytes) + if not m: + return phenny.reply("Sorry, didn't understand the input.") + length, scale, message = m.groups() - length = float(length) - factor = scaling.get(scale, 60) - duration = length * factor + length = float(length) + factor = scaling.get(scale, 60) + duration = length * factor - if duration % 1: - duration = int(duration) + 1 - else: duration = int(duration) + if duration % 1: + duration = int(duration) + 1 + else: duration = int(duration) - t = int(time.time()) + duration - reminder = (input.sender, input.nick, message) + t = int(time.time()) + duration + reminder = (input.sender, input.nick, message) - try: phenny.rdb[t].append(reminder) - except KeyError: phenny.rdb[t] = [reminder] + try: phenny.rdb[t].append(reminder) + except KeyError: phenny.rdb[t] = [reminder] - dump_database(phenny.rfn, phenny.rdb) + dump_database(phenny.rfn, phenny.rdb) - if duration >= 60: - w = '' - if duration >= 3600 * 12: - w += time.strftime(' on %d %b %Y', time.gmtime(t)) - w += time.strftime(' at %H:%MZ', time.gmtime(t)) - phenny.reply('Okay, will remind%s' % w) - else: phenny.reply('Okay, will remind in %s secs' % duration) + if duration >= 60: + w = '' + if duration >= 3600 * 12: + w += time.strftime(' on %d %b %Y', time.gmtime(t)) + w += time.strftime(' at %H:%MZ', time.gmtime(t)) + phenny.reply('Okay, will remind%s' % w) + else: phenny.reply('Okay, will remind in %s secs' % duration) remind.commands = ['in'] r_time = re.compile(r'^([0-9]{2}[:.][0-9]{2})') @@ -145,49 +145,49 @@ import calendar from clock import TimeZones def at(phenny, input): - bytes = input[4:] + bytes = input[4:] - m = r_time.match(bytes) - if not m: - return phenny.reply("Sorry, didn't understand the time spec.") - t = m.group(1).replace('.', ':') - bytes = bytes[len(t):] + m = r_time.match(bytes) + if not m: + return phenny.reply("Sorry, didn't understand the time spec.") + t = m.group(1).replace('.', ':') + bytes = bytes[len(t):] - m = r_zone.match(bytes) - if not m: - return phenny.reply("Sorry, didn't understand the zone spec.") - z = m.group(2) - bytes = bytes[len(m.group(1)):].strip().encode("utf-8") + m = r_zone.match(bytes) + if not m: + return phenny.reply("Sorry, didn't understand the zone spec.") + z = m.group(2) + bytes = bytes[len(m.group(1)):].strip().encode("utf-8") - if z.startswith('+') or z.startswith('-'): - tz = int(z) + if z.startswith('+') or z.startswith('-'): + tz = int(z) - if TimeZones.has_key(z): - tz = TimeZones[z] - else: return phenny.reply("Sorry, didn't understand the time zone.") + if TimeZones.has_key(z): + tz = TimeZones[z] + else: return phenny.reply("Sorry, didn't understand the time zone.") - d = time.strftime("%Y-%m-%d", time.gmtime()) - d = time.strptime(("%s %s" % (d, t)).encode("utf-8"), "%Y-%m-%d %H:%M") + d = time.strftime("%Y-%m-%d", time.gmtime()) + d = time.strptime(("%s %s" % (d, t)).encode("utf-8"), "%Y-%m-%d %H:%M") - d = int(calendar.timegm(d) - (3600 * tz)) - duration = int((d - time.time()) / 60) + d = int(calendar.timegm(d) - (3600 * tz)) + duration = int((d - time.time()) / 60) - if duration < 1: - return phenny.reply("Sorry, that date is this minute or in the past. And only times in the same day are supported!") + if duration < 1: + return phenny.reply("Sorry, that date is this minute or in the past. And only times in the same day are supported!") - # phenny.say("%s %s %s" % (t, tz, d)) + # phenny.say("%s %s %s" % (t, tz, d)) - reminder = (input.sender, input.nick, bytes) - # phenny.say(str((d, reminder))) - try: phenny.rdb[d].append(reminder) - except KeyError: phenny.rdb[d] = [reminder] + reminder = (input.sender, input.nick, bytes) + # phenny.say(str((d, reminder))) + try: phenny.rdb[d].append(reminder) + except KeyError: phenny.rdb[d] = [reminder] - phenny.sending.acquire() - dump_database(phenny.rfn, phenny.rdb) - phenny.sending.release() + phenny.sending.acquire() + dump_database(phenny.rfn, phenny.rdb) + phenny.sending.release() - phenny.reply("Reminding at %s %s - in %s minute(s)" % (t, z, duration)) + phenny.reply("Reminding at %s %s - in %s minute(s)" % (t, z, duration)) at.commands = ['at'] -if __name__ == '__main__': - print __doc__.strip() +if __name__ == '__main__': + print __doc__.strip() diff --git a/modules/search.py b/modules/search.py index 5d038af..bd71d71 100755 --- a/modules/search.py +++ b/modules/search.py @@ -11,255 +11,255 @@ import re import web class Grab(web.urllib.URLopener): - def __init__(self, *args): - self.version = 'Mozilla/5.0 (Phenny)' - web.urllib.URLopener.__init__(self, *args) - self.addheader('Referer', 'https://github.com/sbp/phenny') - def http_error_default(self, url, fp, errcode, errmsg, headers): - return web.urllib.addinfourl(fp, [headers, errcode], "http:" + url) - -def google_ajax(query): - """Search using AjaxSearch, and return its JSON.""" - if isinstance(query, unicode): - query = query.encode('utf-8') - uri = 'http://ajax.googleapis.com/ajax/services/search/web' - args = '?v=1.0&safe=off&q=' + web.urllib.quote(query) - handler = web.urllib._urlopener - web.urllib._urlopener = Grab() - bytes = web.get(uri + args) - web.urllib._urlopener = handler - return web.json(bytes) - -def google_search(query): - results = google_ajax(query) - try: return results['responseData']['results'][0]['unescapedUrl'] - except IndexError: return None - except TypeError: - print results - return False - -def google_count(query): - results = google_ajax(query) - if not results.has_key('responseData'): return '0' - if not results['responseData'].has_key('cursor'): return '0' - if not results['responseData']['cursor'].has_key('estimatedResultCount'): - return '0' - return results['responseData']['cursor']['estimatedResultCount'] - -def formatnumber(n): - """Format a number with beautiful commas.""" - parts = list(str(n)) - for i in range((len(parts) - 3), 0, -3): - parts.insert(i, ',') - return ''.join(parts) + def __init__(self, *args): + self.version = 'Mozilla/5.0 (Phenny)' + web.urllib.URLopener.__init__(self, *args) + self.addheader('Referer', 'https://github.com/sbp/phenny') + def http_error_default(self, url, fp, errcode, errmsg, headers): + return web.urllib.addinfourl(fp, [headers, errcode], "http:" + url) + +def google_ajax(query): + """Search using AjaxSearch, and return its JSON.""" + if isinstance(query, unicode): + query = query.encode('utf-8') + uri = 'http://ajax.googleapis.com/ajax/services/search/web' + args = '?v=1.0&safe=off&q=' + web.urllib.quote(query) + handler = web.urllib._urlopener + web.urllib._urlopener = Grab() + bytes = web.get(uri + args) + web.urllib._urlopener = handler + return web.json(bytes) + +def google_search(query): + results = google_ajax(query) + try: return results['responseData']['results'][0]['unescapedUrl'] + except IndexError: return None + except TypeError: + print results + return False + +def google_count(query): + results = google_ajax(query) + if not results.has_key('responseData'): return '0' + if not results['responseData'].has_key('cursor'): return '0' + if not results['responseData']['cursor'].has_key('estimatedResultCount'): + return '0' + return results['responseData']['cursor']['estimatedResultCount'] + +def formatnumber(n): + """Format a number with beautiful commas.""" + parts = list(str(n)) + for i in range((len(parts) - 3), 0, -3): + parts.insert(i, ',') + return ''.join(parts) def old_gc(query): - return formatnumber(google_count(query)) - -def g(phenny, input): - """Queries Google for the specified input.""" - query = input.group(2) - if not query: - return phenny.reply('.g what?') - query = query.encode('utf-8') - uri = google_search(query) - if uri: - phenny.reply(uri) - if not hasattr(phenny.bot, 'last_seen_uri'): - phenny.bot.last_seen_uri = {} - phenny.bot.last_seen_uri[input.sender] = uri - elif uri is False: phenny.reply("Problem getting data from Google.") - else: phenny.reply("No results found for '%s'." % query) + return formatnumber(google_count(query)) + +def g(phenny, input): + """Queries Google for the specified input.""" + query = input.group(2) + if not query: + return phenny.reply('.g what?') + query = query.encode('utf-8') + uri = google_search(query) + if uri: + phenny.reply(uri) + if not hasattr(phenny.bot, 'last_seen_uri'): + phenny.bot.last_seen_uri = {} + phenny.bot.last_seen_uri[input.sender] = uri + elif uri is False: phenny.reply("Problem getting data from Google.") + else: phenny.reply("No results found for '%s'." % query) g.commands = ['g'] g.priority = 'high' g.example = '.g swhack' -def oldgc(phenny, input): - """Returns the number of Google results for the specified input.""" - query = input.group(2) - if not query: - return phenny.reply('.gc what?') - query = query.encode('utf-8') - num = formatnumber(google_count(query)) - phenny.say(query + ': ' + num) +def oldgc(phenny, input): + """Returns the number of Google results for the specified input.""" + query = input.group(2) + if not query: + return phenny.reply('.gc what?') + query = query.encode('utf-8') + num = formatnumber(google_count(query)) + phenny.say(query + ': ' + num) oldgc.commands = ['ogc', 'oldgc'] oldgc.example = '.oldgc extrapolate' r_query = re.compile( - r'\+?"[^"\\]*(?:\\.[^"\\]*)*"|\[[^]\\]*(?:\\.[^]\\]*)*\]|\S+' + r'\+?"[^"\\]*(?:\\.[^"\\]*)*"|\[[^]\\]*(?:\\.[^]\\]*)*\]|\S+' ) -def gcs(phenny, input): - if not input.group(2): - return phenny.reply("Nothing to compare.") - queries = r_query.findall(input.group(2)) - if len(queries) > 6: - return phenny.reply('Sorry, can only compare up to six things.') - - results = [] - for i, query in enumerate(queries): - query = query.strip('[]') - query = query.encode('utf-8') - n = int((formatnumber(google_count(query)) or '0').replace(',', '')) - results.append((n, query)) - if i >= 2: __import__('time').sleep(0.25) - if i >= 4: __import__('time').sleep(0.25) - - results = [(term, n) for (n, term) in reversed(sorted(results))] - reply = ', '.join('%s (%s)' % (t, formatnumber(n)) for (t, n) in results) - phenny.say(reply) +def gcs(phenny, input): + if not input.group(2): + return phenny.reply("Nothing to compare.") + queries = r_query.findall(input.group(2)) + if len(queries) > 6: + return phenny.reply('Sorry, can only compare up to six things.') + + results = [] + for i, query in enumerate(queries): + query = query.strip('[]') + query = query.encode('utf-8') + n = int((formatnumber(google_count(query)) or '0').replace(',', '')) + results.append((n, query)) + if i >= 2: __import__('time').sleep(0.25) + if i >= 4: __import__('time').sleep(0.25) + + results = [(term, n) for (n, term) in reversed(sorted(results))] + reply = ', '.join('%s (%s)' % (t, formatnumber(n)) for (t, n) in results) + phenny.say(reply) gcs.commands = ['gcs', 'comp'] r_bing = re.compile(r'

    ') -def duck_search(query): - query = query.replace('!', '') - query = web.urllib.quote(query) - uri = 'http://duckduckgo.com/html/?q=%s&kl=uk-en' % query - bytes = web.get(uri) - m = r_duck.search(bytes) - if m: return web.decode(m.group(1)) - -def duck(phenny, input): - query = input.group(2) - if not query: return phenny.reply('.ddg what?') - - query = query.encode('utf-8') - uri = duck_search(query) - if uri: - phenny.reply(uri) - if not hasattr(phenny.bot, 'last_seen_uri'): - phenny.bot.last_seen_uri = {} - phenny.bot.last_seen_uri[input.sender] = uri - else: phenny.reply("No results found for '%s'." % query) +def duck_search(query): + query = query.replace('!', '') + query = web.urllib.quote(query) + uri = 'http://duckduckgo.com/html/?q=%s&kl=uk-en' % query + bytes = web.get(uri) + m = r_duck.search(bytes) + if m: return web.decode(m.group(1)) + +def duck(phenny, input): + query = input.group(2) + if not query: return phenny.reply('.ddg what?') + + query = query.encode('utf-8') + uri = duck_search(query) + if uri: + phenny.reply(uri) + if not hasattr(phenny.bot, 'last_seen_uri'): + phenny.bot.last_seen_uri = {} + phenny.bot.last_seen_uri[input.sender] = uri + else: phenny.reply("No results found for '%s'." % query) duck.commands = ['duck', 'ddg'] -def search(phenny, input): - if not input.group(2): - return phenny.reply('.search for what?') - query = input.group(2).encode('utf-8') - gu = google_search(query) or '-' - bu = bing_search(query) or '-' - du = duck_search(query) or '-' - - if (gu == bu) and (bu == du): - result = '%s (g, b, d)' % gu - elif (gu == bu): - result = '%s (g, b), %s (d)' % (gu, du) - elif (bu == du): - result = '%s (b, d), %s (g)' % (bu, gu) - elif (gu == du): - result = '%s (g, d), %s (b)' % (gu, bu) - else: - if len(gu) > 250: gu = '(extremely long link)' - if len(bu) > 150: bu = '(extremely long link)' - if len(du) > 150: du = '(extremely long link)' - result = '%s (g), %s (b), %s (d)' % (gu, bu, du) - - phenny.reply(result) +def search(phenny, input): + if not input.group(2): + return phenny.reply('.search for what?') + query = input.group(2).encode('utf-8') + gu = google_search(query) or '-' + bu = bing_search(query) or '-' + du = duck_search(query) or '-' + + if (gu == bu) and (bu == du): + result = '%s (g, b, d)' % gu + elif (gu == bu): + result = '%s (g, b), %s (d)' % (gu, du) + elif (bu == du): + result = '%s (b, d), %s (g)' % (bu, gu) + elif (gu == du): + result = '%s (g, d), %s (b)' % (gu, bu) + else: + if len(gu) > 250: gu = '(extremely long link)' + if len(bu) > 150: bu = '(extremely long link)' + if len(du) > 150: du = '(extremely long link)' + result = '%s (g), %s (b), %s (d)' % (gu, bu, du) + + phenny.reply(result) search.commands = ['search'] -def suggest(phenny, input): - if not input.group(2): - return phenny.reply("No query term.") - query = input.group(2).encode('utf-8') - uri = 'http://websitedev.de/temp-bin/suggest.pl?q=' - answer = web.get(uri + web.urllib.quote(query).replace('+', '%2B')) - if answer: - phenny.say(answer) - else: phenny.reply('Sorry, no result.') +def suggest(phenny, input): + if not input.group(2): + return phenny.reply("No query term.") + query = input.group(2).encode('utf-8') + uri = 'http://websitedev.de/temp-bin/suggest.pl?q=' + answer = web.get(uri + web.urllib.quote(query).replace('+', '%2B')) + if answer: + phenny.say(answer) + else: phenny.reply('Sorry, no result.') suggest.commands = ['suggest'] def new_gc(query): - uri = 'https://www.google.com/search?hl=en&q=' - uri = uri + web.urllib.quote(query).replace('+', '%2B') - # if '"' in query: uri += '&tbs=li:1' - bytes = web.get(uri) - if "did not match any documents" in bytes: - return "0" - for result in re.compile(r'(?ims)([0-9,]+) results?').findall(bytes): - return result - return None + uri = 'https://www.google.com/search?hl=en&q=' + uri = uri + web.urllib.quote(query).replace('+', '%2B') + # if '"' in query: uri += '&tbs=li:1' + bytes = web.get(uri) + if "did not match any documents" in bytes: + return "0" + for result in re.compile(r'(?ims)([0-9,]+) results?').findall(bytes): + return result + return None def newest_gc(query): - uri = 'https://www.google.com/search?hl=en&q=' - uri = uri + web.urllib.quote(query).replace('+', '%2B') - bytes = web.get(uri + '&tbs=li:1') - if "did not match any documents" in bytes: - return "0" - for result in re.compile(r'(?ims)([0-9,]+) results?').findall(bytes): - return result - return None + uri = 'https://www.google.com/search?hl=en&q=' + uri = uri + web.urllib.quote(query).replace('+', '%2B') + bytes = web.get(uri + '&tbs=li:1') + if "did not match any documents" in bytes: + return "0" + for result in re.compile(r'(?ims)([0-9,]+) results?').findall(bytes): + return result + return None def newerest_gc(query): - uri = 'https://www.google.com/search?hl=en&q=' - uri = uri + web.urllib.quote(query).replace('+', '%2B') - bytes = web.get(uri + '&prmd=imvns&start=950') - if "did not match any documents" in bytes: - return "0" - for result in re.compile(r'(?ims)([0-9,]+) results?').findall(bytes): - return result - return None + uri = 'https://www.google.com/search?hl=en&q=' + uri = uri + web.urllib.quote(query).replace('+', '%2B') + bytes = web.get(uri + '&prmd=imvns&start=950') + if "did not match any documents" in bytes: + return "0" + for result in re.compile(r'(?ims)([0-9,]+) results?').findall(bytes): + return result + return None def ngc(phenny, input): - if not input.group(2): - return phenny.reply("No query term.") - query = input.group(2).encode('utf-8') - result = new_gc(query) - if result: - phenny.say(query + ": " + result) - else: phenny.reply("Sorry, couldn't get a result.") + if not input.group(2): + return phenny.reply("No query term.") + query = input.group(2).encode('utf-8') + result = new_gc(query) + if result: + phenny.say(query + ": " + result) + else: phenny.reply("Sorry, couldn't get a result.") ngc.commands = ['ngc'] ngc.priority = 'high' ngc.example = '.ngc extrapolate' def gc(phenny, input): - if not input.group(2): - return phenny.reply("No query term.") - query = input.group(2).encode('utf-8') - result = query + ": " - result += (old_gc(query) or "?") + " (api)" - result += ", " + (newerest_gc(query) or "?") + " (end)" - result += ", " + (new_gc(query) or "?") + " (site)" - if '"' in query: - result += ", " + (newest_gc(query) or "?") + " (verbatim)" - phenny.say(result) + if not input.group(2): + return phenny.reply("No query term.") + query = input.group(2).encode('utf-8') + result = query + ": " + result += (old_gc(query) or "?") + " (api)" + result += ", " + (newerest_gc(query) or "?") + " (end)" + result += ", " + (new_gc(query) or "?") + " (site)" + if '"' in query: + result += ", " + (newest_gc(query) or "?") + " (verbatim)" + phenny.say(result) gc.commands = ['gc'] gc.priority = 'high' gc.example = '.gc extrapolate' -if __name__ == '__main__': - print __doc__.strip() +if __name__ == '__main__': + print __doc__.strip() diff --git a/modules/seen.py b/modules/seen.py index 8ed41a8..06dca3e 100755 --- a/modules/seen.py +++ b/modules/seen.py @@ -10,43 +10,43 @@ http://inamidst.com/phenny/ import time from tools import deprecated -def seen(phenny, input): - """.seen - Reports when was last seen.""" - nick = input.group(2) - if not nick: - return phenny.reply("Need a nickname to search for...") - nick = nick.lower() - - if not hasattr(phenny, 'seen'): - return phenny.reply("?") - - if phenny.seen.has_key(nick): - channel, t = phenny.seen[nick] - t = time.strftime('%Y-%m-%d %H:%M:%S UTC', time.gmtime(t)) - - msg = "I last saw %s at %s on %s" % (nick, t, channel) - phenny.reply(msg) - else: phenny.reply("Sorry, I haven't seen %s around." % nick) +def seen(phenny, input): + """.seen - Reports when was last seen.""" + nick = input.group(2) + if not nick: + return phenny.reply("Need a nickname to search for...") + nick = nick.lower() + + if not hasattr(phenny, 'seen'): + return phenny.reply("?") + + if phenny.seen.has_key(nick): + channel, t = phenny.seen[nick] + t = time.strftime('%Y-%m-%d %H:%M:%S UTC', time.gmtime(t)) + + msg = "I last saw %s at %s on %s" % (nick, t, channel) + phenny.reply(msg) + else: phenny.reply("Sorry, I haven't seen %s around." % nick) seen.rule = (['seen'], r'(\S+)') @deprecated -def f_note(self, origin, match, args): - def note(self, origin, match, args): - if not hasattr(self.bot, 'seen'): - self.bot.seen = {} - if origin.sender.startswith('#'): - # if origin.sender == '#inamidst': return - self.seen[origin.nick.lower()] = (origin.sender, time.time()) - - # if not hasattr(self, 'chanspeak'): - # self.chanspeak = {} - # if (len(args) > 2) and args[2].startswith('#'): - # self.chanspeak[args[2]] = args[0] - - try: note(self, origin, match, args) - except Exception, e: print e +def f_note(self, origin, match, args): + def note(self, origin, match, args): + if not hasattr(self.bot, 'seen'): + self.bot.seen = {} + if origin.sender.startswith('#'): + # if origin.sender == '#inamidst': return + self.seen[origin.nick.lower()] = (origin.sender, time.time()) + + # if not hasattr(self, 'chanspeak'): + # self.chanspeak = {} + # if (len(args) > 2) and args[2].startswith('#'): + # self.chanspeak[args[2]] = args[0] + + try: note(self, origin, match, args) + except Exception, e: print e f_note.rule = r'(.*)' f_note.priority = 'low' -if __name__ == '__main__': - print __doc__.strip() +if __name__ == '__main__': + print __doc__.strip() diff --git a/modules/startup.py b/modules/startup.py index 81b3ecf..b9ad910 100755 --- a/modules/startup.py +++ b/modules/startup.py @@ -9,61 +9,61 @@ http://inamidst.com/phenny/ import threading, time -def setup(phenny): - print("Setting up phenny") - # by clsn - phenny.data = {} - refresh_delay = 300.0 +def setup(phenny): + print("Setting up phenny") + # by clsn + phenny.data = {} + refresh_delay = 300.0 - if hasattr(phenny.config, 'refresh_delay'): - try: refresh_delay = float(phenny.config.refresh_delay) - except: pass + if hasattr(phenny.config, 'refresh_delay'): + try: refresh_delay = float(phenny.config.refresh_delay) + except: pass - def close(): - print "Nobody PONGed our PING, restarting" - phenny.handle_close() - - def pingloop(): - timer = threading.Timer(refresh_delay, close, ()) - phenny.data['startup.setup.timer'] = timer - phenny.data['startup.setup.timer'].start() - # print "PING!" - phenny.write(('PING', phenny.config.host)) - phenny.data['startup.setup.pingloop'] = pingloop + def close(): + print "Nobody PONGed our PING, restarting" + phenny.handle_close() - def pong(phenny, input): - try: - # print "PONG!" - phenny.data['startup.setup.timer'].cancel() - time.sleep(refresh_delay + 60.0) - pingloop() - except: pass - pong.event = 'PONG' - pong.thread = True - pong.rule = r'.*' - phenny.variables['pong'] = pong + def pingloop(): + timer = threading.Timer(refresh_delay, close, ()) + phenny.data['startup.setup.timer'] = timer + phenny.data['startup.setup.timer'].start() + # print "PING!" + phenny.write(('PING', phenny.config.host)) + phenny.data['startup.setup.pingloop'] = pingloop -def startup(phenny, input): - import time + def pong(phenny, input): + try: + # print "PONG!" + phenny.data['startup.setup.timer'].cancel() + time.sleep(refresh_delay + 60.0) + pingloop() + except: pass + pong.event = 'PONG' + pong.thread = True + pong.rule = r'.*' + phenny.variables['pong'] = pong - # Start the ping loop. Has to be done after USER on e.g. quakenet - if phenny.data.get('startup.setup.pingloop'): - phenny.data['startup.setup.pingloop']() +def startup(phenny, input): + import time - if hasattr(phenny.config, 'serverpass'): - phenny.write(('PASS', phenny.config.serverpass)) + # Start the ping loop. Has to be done after USER on e.g. quakenet + if phenny.data.get('startup.setup.pingloop'): + phenny.data['startup.setup.pingloop']() - if hasattr(phenny.config, 'password'): - phenny.msg('NickServ', 'IDENTIFY %s' % phenny.config.password) - time.sleep(5) + if hasattr(phenny.config, 'serverpass'): + phenny.write(('PASS', phenny.config.serverpass)) - # Cf. http://swhack.com/logs/2005-12-05#T19-32-36 - for channel in phenny.channels: - phenny.write(('JOIN', channel)) - time.sleep(0.5) + if hasattr(phenny.config, 'password'): + phenny.msg('NickServ', 'IDENTIFY %s' % phenny.config.password) + time.sleep(5) + + # Cf. http://swhack.com/logs/2005-12-05#T19-32-36 + for channel in phenny.channels: + phenny.write(('JOIN', channel)) + time.sleep(0.5) startup.rule = r'(.*)' startup.event = '251' startup.priority = 'low' -if __name__ == '__main__': - print __doc__.strip() +if __name__ == '__main__': + print __doc__.strip() diff --git a/modules/tell.py b/modules/tell.py index a82fad1..f230c06 100755 --- a/modules/tell.py +++ b/modules/tell.py @@ -23,136 +23,136 @@ lispchannels = frozenset([ '#lisp', '#scheme', '#opendarwin', '#macdev', '#perl6', '#sdlperl', '#ksvg', '#rcirc', '#code4lib', '#linux-quebec', '#programmering', '#maxima', '#robin', '##concurrency', '#paredit' ]) -def loadReminders(fn): - result = {} - f = open(fn) - for line in f: - line = line.strip() - if line: - try: tellee, teller, verb, timenow, msg = line.split('\t', 4) - except ValueError: continue # @@ hmm - result.setdefault(tellee, []).append((teller, verb, timenow, msg)) - f.close() - return result - -def dumpReminders(fn, data): - f = open(fn, 'w') - for tellee in data.iterkeys(): - for remindon in data[tellee]: - line = '\t'.join((tellee,) + remindon) - try: f.write(line + '\n') - except IOError: break - try: f.close() - except IOError: pass - return True - -def setup(self): - fn = self.nick + '-' + self.config.host + '.tell.db' - self.tell_filename = os.path.join(os.path.expanduser('~/.phenny'), fn) - if not os.path.exists(self.tell_filename): - try: f = open(self.tell_filename, 'w') - except OSError: pass - else: - f.write('') - f.close() - self.reminders = loadReminders(self.tell_filename) # @@ tell - -def f_remind(phenny, input): - teller = input.nick - - # @@ Multiple comma-separated tellees? Cf. Terje, #swhack, 2006-04-15 - verb, tellee, msg = input.groups() - verb = verb.encode('utf-8') - tellee = tellee.encode('utf-8') - msg = msg.encode('utf-8') - - tellee_original = tellee.rstrip('.,:;') - tellee = tellee_original.lower() - - if not os.path.exists(phenny.tell_filename): - return - - if len(tellee) > 20: - return phenny.reply('That nickname is too long.') - - timenow = time.strftime('%d %b %H:%MZ', time.gmtime()) - if not tellee in (teller.lower(), phenny.nick, 'me'): # @@ - # @@ and year, if necessary - warn = False - if not phenny.reminders.has_key(tellee): - phenny.reminders[tellee] = [(teller, verb, timenow, msg)] - else: - # if len(phenny.reminders[tellee]) >= maximum: - # warn = True - phenny.reminders[tellee].append((teller, verb, timenow, msg)) - # @@ Stephanie's augmentation - response = "I'll pass that on when %s is around." % tellee_original - # if warn: response += (" I'll have to use a pastebin, though, so " + - # "your message may get lost.") - - rand = random.random() - if rand > 0.9999: response = "yeah, yeah" - elif rand > 0.999: response = "yeah, sure, whatever" - - phenny.reply(response) - elif teller.lower() == tellee: - phenny.say('You can %s yourself that.' % verb) - else: phenny.say("Hey, I'm not as stupid as Monty you know!") - - dumpReminders(phenny.tell_filename, phenny.reminders) # @@ tell +def loadReminders(fn): + result = {} + f = open(fn) + for line in f: + line = line.strip() + if line: + try: tellee, teller, verb, timenow, msg = line.split('\t', 4) + except ValueError: continue # @@ hmm + result.setdefault(tellee, []).append((teller, verb, timenow, msg)) + f.close() + return result + +def dumpReminders(fn, data): + f = open(fn, 'w') + for tellee in data.iterkeys(): + for remindon in data[tellee]: + line = '\t'.join((tellee,) + remindon) + try: f.write(line + '\n') + except IOError: break + try: f.close() + except IOError: pass + return True + +def setup(self): + fn = self.nick + '-' + self.config.host + '.tell.db' + self.tell_filename = os.path.join(os.path.expanduser('~/.phenny'), fn) + if not os.path.exists(self.tell_filename): + try: f = open(self.tell_filename, 'w') + except OSError: pass + else: + f.write('') + f.close() + self.reminders = loadReminders(self.tell_filename) # @@ tell + +def f_remind(phenny, input): + teller = input.nick + + # @@ Multiple comma-separated tellees? Cf. Terje, #swhack, 2006-04-15 + verb, tellee, msg = input.groups() + verb = verb.encode('utf-8') + tellee = tellee.encode('utf-8') + msg = msg.encode('utf-8') + + tellee_original = tellee.rstrip('.,:;') + tellee = tellee_original.lower() + + if not os.path.exists(phenny.tell_filename): + return + + if len(tellee) > 20: + return phenny.reply('That nickname is too long.') + + timenow = time.strftime('%d %b %H:%MZ', time.gmtime()) + if not tellee in (teller.lower(), phenny.nick, 'me'): # @@ + # @@ and year, if necessary + warn = False + if not phenny.reminders.has_key(tellee): + phenny.reminders[tellee] = [(teller, verb, timenow, msg)] + else: + # if len(phenny.reminders[tellee]) >= maximum: + # warn = True + phenny.reminders[tellee].append((teller, verb, timenow, msg)) + # @@ Stephanie's augmentation + response = "I'll pass that on when %s is around." % tellee_original + # if warn: response += (" I'll have to use a pastebin, though, so " + + # "your message may get lost.") + + rand = random.random() + if rand > 0.9999: response = "yeah, yeah" + elif rand > 0.999: response = "yeah, sure, whatever" + + phenny.reply(response) + elif teller.lower() == tellee: + phenny.say('You can %s yourself that.' % verb) + else: phenny.say("Hey, I'm not as stupid as Monty you know!") + + dumpReminders(phenny.tell_filename, phenny.reminders) # @@ tell f_remind.rule = ('$nick', ['tell', 'ask'], r'(\S+) (.*)') -def getReminders(phenny, channel, key, tellee): - lines = [] - template = "%s: %s <%s> %s %s %s" - today = time.strftime('%d %b', time.gmtime()) - - for (teller, verb, datetime, msg) in phenny.reminders[key]: - if datetime.startswith(today): - datetime = datetime[len(today)+1:] - lines.append(template % (tellee, datetime, teller, verb, tellee, msg)) - - try: del phenny.reminders[key] - except KeyError: phenny.msg(channel, 'Er...') - return lines - -def message(phenny, input): - if not input.sender.startswith('#'): return - - tellee = input.nick - channel = input.sender - - if not os: return - if not os.path.exists(phenny.tell_filename): - return - - reminders = [] - remkeys = list(reversed(sorted(phenny.reminders.keys()))) - for remkey in remkeys: - if not remkey.endswith('*') or remkey.endswith(':'): - if tellee.lower() == remkey: +def getReminders(phenny, channel, key, tellee): + lines = [] + template = "%s: %s <%s> %s %s %s" + today = time.strftime('%d %b', time.gmtime()) + + for (teller, verb, datetime, msg) in phenny.reminders[key]: + if datetime.startswith(today): + datetime = datetime[len(today)+1:] + lines.append(template % (tellee, datetime, teller, verb, tellee, msg)) + + try: del phenny.reminders[key] + except KeyError: phenny.msg(channel, 'Er...') + return lines + +def message(phenny, input): + if not input.sender.startswith('#'): return + + tellee = input.nick + channel = input.sender + + if not os: return + if not os.path.exists(phenny.tell_filename): + return + + reminders = [] + remkeys = list(reversed(sorted(phenny.reminders.keys()))) + for remkey in remkeys: + if not remkey.endswith('*') or remkey.endswith(':'): + if tellee.lower() == remkey: + phenny.sending.acquire() + reminders.extend(getReminders(phenny, channel, remkey, tellee)) + phenny.sending.release() + elif tellee.lower().strip("0123456789_-[]`") == remkey.rstrip('*:'): phenny.sending.acquire() reminders.extend(getReminders(phenny, channel, remkey, tellee)) phenny.sending.release() - elif tellee.lower().strip("0123456789_-[]`") == remkey.rstrip('*:'): - phenny.sending.acquire() - reminders.extend(getReminders(phenny, channel, remkey, tellee)) - phenny.sending.release() - - for line in reminders[:maximum]: - phenny.say(line) - - if reminders[maximum:]: - phenny.say('Further messages sent privately') - for line in reminders[maximum:]: - phenny.msg(tellee, line) - - if len(phenny.reminders.keys()) != remkeys: - phenny.sending.acquire() - dumpReminders(phenny.tell_filename, phenny.reminders) # @@ tell - phenny.sending.release() + + for line in reminders[:maximum]: + phenny.say(line) + + if reminders[maximum:]: + phenny.say('Further messages sent privately') + for line in reminders[maximum:]: + phenny.msg(tellee, line) + + if len(phenny.reminders.keys()) != remkeys: + phenny.sending.acquire() + dumpReminders(phenny.tell_filename, phenny.reminders) # @@ tell + phenny.sending.release() message.rule = r'(.*)' message.priority = 'low' -if __name__ == '__main__': - print __doc__.strip() +if __name__ == '__main__': + print __doc__.strip() diff --git a/modules/translate.py b/modules/translate.py index 11e4f28..dce080e 100755 --- a/modules/translate.py +++ b/modules/translate.py @@ -11,135 +11,135 @@ http://inamidst.com/phenny/ import re, urllib import web -def translate(text, input='auto', output='en'): - raw = False - if output.endswith('-raw'): - output = output[:-4] - raw = True +def translate(text, input='auto', output='en'): + raw = False + if output.endswith('-raw'): + output = output[:-4] + raw = True - import urllib2, json - opener = urllib2.build_opener() - opener.addheaders = [( - 'User-Agent', 'Mozilla/5.0' + - '(X11; U; Linux i686)' + - 'Gecko/20071127 Firefox/2.0.0.11' - )] + import urllib2, json + opener = urllib2.build_opener() + opener.addheaders = [( + 'User-Agent', 'Mozilla/5.0' + + '(X11; U; Linux i686)' + + 'Gecko/20071127 Firefox/2.0.0.11' + )] - input, output = urllib.quote(input), urllib.quote(output) - text = urllib.quote(text) + input, output = urllib.quote(input), urllib.quote(output) + text = urllib.quote(text) - result = opener.open('http://translate.google.com/translate_a/t?' + - ('client=t&hl=en&sl=%s&tl=%s&multires=1' % (input, output)) + - ('&otf=1&ssel=0&tsel=0&uptl=en&sc=1&text=%s' % text)).read() + result = opener.open('http://translate.google.com/translate_a/t?' + + ('client=t&hl=en&sl=%s&tl=%s&multires=1' % (input, output)) + + ('&otf=1&ssel=0&tsel=0&uptl=en&sc=1&text=%s' % text)).read() - while ',,' in result: - result = result.replace(',,', ',null,') - data = json.loads(result) + while ',,' in result: + result = result.replace(',,', ',null,') + data = json.loads(result) - if raw: - return str(data), 'en-raw' + if raw: + return str(data), 'en-raw' - try: language = data[2] # -2][0][0] - except: language = '?' + try: language = data[2] # -2][0][0] + except: language = '?' - return ''.join(x[0] for x in data[0]), language + return ''.join(x[0] for x in data[0]), language -def tr(phenny, context): - """Translates a phrase, with an optional language hint.""" - input, output, phrase = context.groups() +def tr(phenny, context): + """Translates a phrase, with an optional language hint.""" + input, output, phrase = context.groups() - phrase = phrase.encode('utf-8') + phrase = phrase.encode('utf-8') - if (len(phrase) > 350) and (not context.admin): - return phenny.reply('Phrase must be under 350 characters.') + if (len(phrase) > 350) and (not context.admin): + return phenny.reply('Phrase must be under 350 characters.') - input = input or 'auto' - input = input.encode('utf-8') - output = (output or 'en').encode('utf-8') + input = input or 'auto' + input = input.encode('utf-8') + output = (output or 'en').encode('utf-8') - if input != output: - msg, input = translate(phrase, input, output) - if isinstance(msg, str): - msg = msg.decode('utf-8') - if msg: - msg = web.decode(msg) # msg.replace(''', "'") - msg = '"%s" (%s to %s, translate.google.com)' % (msg, input, output) - else: msg = 'The %s to %s translation failed, sorry!' % (input, output) + if input != output: + msg, input = translate(phrase, input, output) + if isinstance(msg, str): + msg = msg.decode('utf-8') + if msg: + msg = web.decode(msg) # msg.replace(''', "'") + msg = '"%s" (%s to %s, translate.google.com)' % (msg, input, output) + else: msg = 'The %s to %s translation failed, sorry!' % (input, output) - phenny.reply(msg) - else: phenny.reply('Language guessing failed, so try suggesting one!') + phenny.reply(msg) + else: phenny.reply('Language guessing failed, so try suggesting one!') tr.rule = ('$nick', ur'(?:([a-z]{2}) +)?(?:([a-z]{2}|en-raw) +)?["“](.+?)["”]\? *$') tr.example = '$nickname: "mon chien"? or $nickname: fr "mon chien"?' tr.priority = 'low' -def tr2(phenny, input): - """Translates a phrase, with an optional language hint.""" - command = input.group(2) - if not command: - return phenny.reply("Need something to translate!") - command = command.encode('utf-8') - - def langcode(p): - return p.startswith(':') and (2 < len(p) < 10) and p[1:].isalpha() - - args = ['auto', 'en'] - - for i in xrange(2): - if not ' ' in command: break - prefix, cmd = command.split(' ', 1) - if langcode(prefix): - args[i] = prefix[1:] - command = cmd - phrase = command - - # if (len(phrase) > 350) and (not input.admin): - # return phenny.reply('Phrase must be under 350 characters.') - - src, dest = args - if src != dest: - msg, src = translate(phrase, src, dest) - if isinstance(msg, str): - msg = msg.decode('utf-8') - if msg: - msg = web.decode(msg) # msg.replace(''', "'") - if len(msg) > 450: msg = msg[:450] + '[...]' - msg = '"%s" (%s to %s, translate.google.com)' % (msg, src, dest) - else: msg = 'The %s to %s translation failed, sorry!' % (src, dest) - - phenny.reply(msg) - else: phenny.reply('Language guessing failed, so try suggesting one!') +def tr2(phenny, input): + """Translates a phrase, with an optional language hint.""" + command = input.group(2) + if not command: + return phenny.reply("Need something to translate!") + command = command.encode('utf-8') + + def langcode(p): + return p.startswith(':') and (2 < len(p) < 10) and p[1:].isalpha() + + args = ['auto', 'en'] + + for i in xrange(2): + if not ' ' in command: break + prefix, cmd = command.split(' ', 1) + if langcode(prefix): + args[i] = prefix[1:] + command = cmd + phrase = command + + # if (len(phrase) > 350) and (not input.admin): + # return phenny.reply('Phrase must be under 350 characters.') + + src, dest = args + if src != dest: + msg, src = translate(phrase, src, dest) + if isinstance(msg, str): + msg = msg.decode('utf-8') + if msg: + msg = web.decode(msg) # msg.replace(''', "'") + if len(msg) > 450: msg = msg[:450] + '[...]' + msg = '"%s" (%s to %s, translate.google.com)' % (msg, src, dest) + else: msg = 'The %s to %s translation failed, sorry!' % (src, dest) + + phenny.reply(msg) + else: phenny.reply('Language guessing failed, so try suggesting one!') tr2.commands = ['tr'] tr2.priority = 'low' -def mangle(phenny, input): - import time +def mangle(phenny, input): + import time - phrase = input.group(2).encode('utf-8') - for lang in ['fr', 'de', 'es', 'it', 'ja']: - backup = phrase[:] - phrase, _lang = translate(phrase, 'en', lang) - phrase = phrase.encode("utf-8") + phrase = input.group(2).encode('utf-8') + for lang in ['fr', 'de', 'es', 'it', 'ja']: + backup = phrase[:] + phrase, _lang = translate(phrase, 'en', lang) + phrase = phrase.encode("utf-8") - if not phrase: - phrase = backup[:] - break - time.sleep(0.25) + if not phrase: + phrase = backup[:] + break + time.sleep(0.25) - backup = phrase[:] - phrase, _lang = translate(phrase, lang, 'en') - phrase = phrase.encode("utf-8") + backup = phrase[:] + phrase, _lang = translate(phrase, lang, 'en') + phrase = phrase.encode("utf-8") - if not phrase: - phrase = backup[:] - break - time.sleep(0.25) + if not phrase: + phrase = backup[:] + break + time.sleep(0.25) - phrase = phrase.replace(' ,', ',').replace(' .', '.') - phrase = phrase.strip(' ,') - phenny.reply(phrase or 'ERRORS SRY') + phrase = phrase.replace(' ,', ',').replace(' .', '.') + phrase = phrase.strip(' ,') + phenny.reply(phrase or 'ERRORS SRY') mangle.commands = ['mangle'] -if __name__ == '__main__': - print __doc__.strip() +if __name__ == '__main__': + print __doc__.strip() diff --git a/modules/twitter.py b/modules/twitter.py index afd1d5c..0ec4744 100755 --- a/modules/twitter.py +++ b/modules/twitter.py @@ -20,74 +20,74 @@ r_whiteline = re.compile(r'(?ims)[ \t]+[\r\n]+') r_breaks = re.compile(r'(?ims)[\r\n]+') def entity(*args, **kargs): - return web.entity(*args, **kargs).encode('utf-8') + return web.entity(*args, **kargs).encode('utf-8') -def decode(html): - return web.r_entity.sub(entity, html) +def decode(html): + return web.r_entity.sub(entity, html) def expand(tweet): - def replacement(match): - anchor = match.group(1) - for link in r_expanded.findall(anchor): - return link - return r_tag.sub('', anchor) - return r_anchor.sub(replacement, tweet) + def replacement(match): + anchor = match.group(1) + for link in r_expanded.findall(anchor): + return link + return r_tag.sub('', anchor) + return r_anchor.sub(replacement, tweet) def read_tweet(url): - bytes = web.get(url) - shim = '
    ' - if shim in bytes: - bytes = bytes.split(shim, 1).pop() - - for text in r_p.findall(bytes): - text = expand(text) - text = r_tag.sub('', text) - text = text.strip() - text = r_whiteline.sub(' ', text) - text = r_breaks.sub(' ', text) - return decode(text) - return "Sorry, couldn't get a tweet from %s" % url + bytes = web.get(url) + shim = '
    ' + if shim in bytes: + bytes = bytes.split(shim, 1).pop() + + for text in r_p.findall(bytes): + text = expand(text) + text = r_tag.sub('', text) + text = text.strip() + text = r_whiteline.sub(' ', text) + text = r_breaks.sub(' ', text) + return decode(text) + return "Sorry, couldn't get a tweet from %s" % url def format(tweet, username): - return '%s (@%s)' % (tweet, username) + return '%s (@%s)' % (tweet, username) def user_tweet(username): - tweet = read_tweet('https://twitter.com/' + username + "?" + str(time.time())) - return format(tweet, username) + tweet = read_tweet('https://twitter.com/' + username + "?" + str(time.time())) + return format(tweet, username) def id_tweet(tid): - link = 'https://twitter.com/twitter/status/' + tid - data = web.head(link) - message, status = tuple(data) - if status == 301: - url = message.get("Location") - if not url: return "Sorry, couldn't get a tweet from %s" % link - username = url.split('/')[3] - tweet = read_tweet(url) - return format(tweet, username) - return "Sorry, couldn't get a tweet from %s" % link + link = 'https://twitter.com/twitter/status/' + tid + data = web.head(link) + message, status = tuple(data) + if status == 301: + url = message.get("Location") + if not url: return "Sorry, couldn't get a tweet from %s" % link + username = url.split('/')[3] + tweet = read_tweet(url) + return format(tweet, username) + return "Sorry, couldn't get a tweet from %s" % link def twitter(phenny, input): - arg = input.group(2) - if not arg: - return phenny.reply("Give me a link, a username, or a tweet id") - - arg = arg.strip() - if isinstance(arg, unicode): - arg = arg.encode('utf-8') - - if arg.isdigit(): - phenny.say(id_tweet(arg)) - elif r_username.match(arg): - phenny.say(user_tweet(arg)) - elif r_link.match(arg): - username = arg.split('/')[3] - tweet = read_tweet(arg) - phenny.say(format(tweet, username)) - else: phenny.reply("Give me a link, a username, or a tweet id") + arg = input.group(2) + if not arg: + return phenny.reply("Give me a link, a username, or a tweet id") + + arg = arg.strip() + if isinstance(arg, unicode): + arg = arg.encode('utf-8') + + if arg.isdigit(): + phenny.say(id_tweet(arg)) + elif r_username.match(arg): + phenny.say(user_tweet(arg)) + elif r_link.match(arg): + username = arg.split('/')[3] + tweet = read_tweet(arg) + phenny.say(format(tweet, username)) + else: phenny.reply("Give me a link, a username, or a tweet id") twitter.commands = ['tw', 'twitter'] twitter.thread = True if __name__ == '__main__': - print __doc__ + print __doc__ diff --git a/modules/validate.py b/modules/validate.py index 85815d1..ac036f5 100755 --- a/modules/validate.py +++ b/modules/validate.py @@ -9,35 +9,35 @@ http://inamidst.com/phenny/ import web -def val(phenny, input): - """Check a webpage using the W3C Markup Validator.""" - if not input.group(2): - return phenny.reply("Nothing to validate.") - uri = input.group(2) - if not uri.startswith('http://'): - uri = 'http://' + uri - - path = '/check?uri=%s;output=xml' % web.urllib.quote(uri) - info = web.head('http://validator.w3.org' + path) - - result = uri + ' is ' - - if isinstance(info, list): - return phenny.say('Got HTTP response %s' % info[1]) - - if info.has_key('X-W3C-Validator-Status'): - result += str(info['X-W3C-Validator-Status']) - if info['X-W3C-Validator-Status'] != 'Valid': - if info.has_key('X-W3C-Validator-Errors'): - n = int(info['X-W3C-Validator-Errors'].split(' ')[0]) - if n != 1: - result += ' (%s errors)' % n - else: result += ' (%s error)' % n - else: result += 'Unvalidatable: no X-W3C-Validator-Status' - - phenny.reply(result) +def val(phenny, input): + """Check a webpage using the W3C Markup Validator.""" + if not input.group(2): + return phenny.reply("Nothing to validate.") + uri = input.group(2) + if not uri.startswith('http://'): + uri = 'http://' + uri + + path = '/check?uri=%s;output=xml' % web.urllib.quote(uri) + info = web.head('http://validator.w3.org' + path) + + result = uri + ' is ' + + if isinstance(info, list): + return phenny.say('Got HTTP response %s' % info[1]) + + if info.has_key('X-W3C-Validator-Status'): + result += str(info['X-W3C-Validator-Status']) + if info['X-W3C-Validator-Status'] != 'Valid': + if info.has_key('X-W3C-Validator-Errors'): + n = int(info['X-W3C-Validator-Errors'].split(' ')[0]) + if n != 1: + result += ' (%s errors)' % n + else: result += ' (%s error)' % n + else: result += 'Unvalidatable: no X-W3C-Validator-Status' + + phenny.reply(result) val.rule = (['val'], r'(?i)(\S+)') val.example = '.val http://www.w3.org/' -if __name__ == '__main__': - print __doc__.strip() +if __name__ == '__main__': + print __doc__.strip() diff --git a/modules/weather.py b/modules/weather.py index 29b01e5..5999b79 100755 --- a/modules/weather.py +++ b/modules/weather.py @@ -13,400 +13,400 @@ from tools import deprecated r_from = re.compile(r'(?i)([+-]\d+):00 from') -def location(name): - name = urllib.quote(name.encode('utf-8')) - uri = 'http://ws.geonames.org/searchJSON?q=%s&maxRows=1' % name - for i in xrange(10): - u = urllib.urlopen(uri) - if u is not None: break - bytes = u.read() - u.close() - - results = web.json(bytes) - try: name = results['geonames'][0]['name'] - except IndexError: - return '?', '?', '0', '0' - countryName = results['geonames'][0]['countryName'] - lat = results['geonames'][0]['lat'] - lng = results['geonames'][0]['lng'] - return name, countryName, lat, lng - -class GrumbleError(object): - pass - -def local(icao, hour, minute): - uri = ('http://www.flightstats.com/' + - 'go/Airport/airportDetails.do?airportCode=%s') - try: bytes = web.get(uri % icao) - except AttributeError: - raise GrumbleError('A WEBSITE HAS GONE DOWN WTF STUPID WEB') - m = r_from.search(bytes) - if m: - offset = m.group(1) - lhour = int(hour) + int(offset) - lhour = lhour % 24 - return (str(lhour) + ':' + str(minute) + ', ' + str(hour) + - str(minute) + 'Z') - # return (str(lhour) + ':' + str(minute) + ' (' + str(hour) + - # ':' + str(minute) + 'Z)') - return str(hour) + ':' + str(minute) + 'Z' - -def code(phenny, search): - from icao import data - - if search.upper() in [loc[0] for loc in data]: - return search.upper() - else: - name, country, latitude, longitude = location(search) - if name == '?': return False - sumOfSquares = (99999999999999999999999999999, 'ICAO') - for icao_code, lat, lon in data: - latDiff = abs(latitude - lat) - lonDiff = abs(longitude - lon) - diff = (latDiff * latDiff) + (lonDiff * lonDiff) - if diff < sumOfSquares[0]: - sumOfSquares = (diff, icao_code) - return sumOfSquares[1] +def location(name): + name = urllib.quote(name.encode('utf-8')) + uri = 'http://ws.geonames.org/searchJSON?q=%s&maxRows=1' % name + for i in xrange(10): + u = urllib.urlopen(uri) + if u is not None: break + bytes = u.read() + u.close() + + results = web.json(bytes) + try: name = results['geonames'][0]['name'] + except IndexError: + return '?', '?', '0', '0' + countryName = results['geonames'][0]['countryName'] + lat = results['geonames'][0]['lat'] + lng = results['geonames'][0]['lng'] + return name, countryName, lat, lng + +class GrumbleError(object): + pass + +def local(icao, hour, minute): + uri = ('http://www.flightstats.com/' + + 'go/Airport/airportDetails.do?airportCode=%s') + try: bytes = web.get(uri % icao) + except AttributeError: + raise GrumbleError('A WEBSITE HAS GONE DOWN WTF STUPID WEB') + m = r_from.search(bytes) + if m: + offset = m.group(1) + lhour = int(hour) + int(offset) + lhour = lhour % 24 + return (str(lhour) + ':' + str(minute) + ', ' + str(hour) + + str(minute) + 'Z') + # return (str(lhour) + ':' + str(minute) + ' (' + str(hour) + + # ':' + str(minute) + 'Z)') + return str(hour) + ':' + str(minute) + 'Z' + +def code(phenny, search): + from icao import data + + if search.upper() in [loc[0] for loc in data]: + return search.upper() + else: + name, country, latitude, longitude = location(search) + if name == '?': return False + sumOfSquares = (99999999999999999999999999999, 'ICAO') + for icao_code, lat, lon in data: + latDiff = abs(latitude - lat) + lonDiff = abs(longitude - lon) + diff = (latDiff * latDiff) + (lonDiff * lonDiff) + if diff < sumOfSquares[0]: + sumOfSquares = (diff, icao_code) + return sumOfSquares[1] @deprecated -def f_weather(self, origin, match, args): - """.weather - Show the weather at airport with the code .""" - if origin.sender == '#talis': - if args[0].startswith('.weather '): return - - icao_code = match.group(2) - if not icao_code: - return self.msg(origin.sender, 'Try .weather London, for example?') - - icao_code = code(self, icao_code) - - if not icao_code: - self.msg(origin.sender, 'No ICAO code found, sorry') - return - - uri = 'http://weather.noaa.gov/pub/data/observations/metar/stations/%s.TXT' - try: bytes = web.get(uri % icao_code) - except AttributeError: - raise GrumbleError('OH CRAP NOAA HAS GONE DOWN THE WEB IS BROKEN') - if 'Not Found' in bytes: - self.msg(origin.sender, icao_code+': no such ICAO code, or no NOAA data') - return - - metar = bytes.splitlines().pop() - metar = metar.split(' ') - - if len(metar[0]) == 4: - metar = metar[1:] - - if metar[0].endswith('Z'): - time = metar[0] - metar = metar[1:] - else: time = None - - if metar[0] == 'AUTO': - metar = metar[1:] - if metar[0] == 'VCU': - self.msg(origin.sender, icao_code + ': no data provided') - return - - if metar[0].endswith('KT'): - wind = metar[0] - metar = metar[1:] - else: wind = None - - if ('V' in metar[0]) and (metar[0] != 'CAVOK'): - vari = metar[0] - metar = metar[1:] - else: vari = None - - if ((len(metar[0]) == 4) or - metar[0].endswith('SM')): - visibility = metar[0] - metar = metar[1:] - else: visibility = None - - while metar[0].startswith('R') and (metar[0].endswith('L') - or 'L/' in metar[0]): - metar = metar[1:] - - if len(metar[0]) == 6 and (metar[0].endswith('N') or - metar[0].endswith('E') or - metar[0].endswith('S') or - metar[0].endswith('W')): - metar = metar[1:] # 7000SE? - - cond = [] - while (((len(metar[0]) < 5) or - metar[0].startswith('+') or - metar[0].startswith('-')) and (not (metar[0].startswith('VV') or - metar[0].startswith('SKC') or metar[0].startswith('CLR') or - metar[0].startswith('FEW') or metar[0].startswith('SCT') or - metar[0].startswith('BKN') or metar[0].startswith('OVC')))): - cond.append(metar[0]) - metar = metar[1:] - - while '/P' in metar[0]: - metar = metar[1:] - - if not metar: - self.msg(origin.sender, icao_code + ': no data provided') - return - - cover = [] - while (metar[0].startswith('VV') or metar[0].startswith('SKC') or - metar[0].startswith('CLR') or metar[0].startswith('FEW') or - metar[0].startswith('SCT') or metar[0].startswith('BKN') or - metar[0].startswith('OVC')): - cover.append(metar[0]) - metar = metar[1:] - if not metar: - self.msg(origin.sender, icao_code + ': no data provided') - return - - if metar[0] == 'CAVOK': - cover.append('CLR') - metar = metar[1:] - - if metar[0] == 'PRFG': - cover.append('CLR') # @@? - metar = metar[1:] - - if metar[0] == 'NSC': - cover.append('CLR') - metar = metar[1:] - - if ('/' in metar[0]) or (len(metar[0]) == 5 and metar[0][2] == '.'): - temp = metar[0] - metar = metar[1:] - else: temp = None - - if metar[0].startswith('QFE'): - metar = metar[1:] - - if metar[0].startswith('Q') or metar[0].startswith('A'): - pressure = metar[0] - metar = metar[1:] - else: pressure = None - - if time: - hour = time[2:4] - minute = time[4:6] - time = local(icao_code, hour, minute) - else: time = '(time unknown)' - - if wind: - speed = int(wind[3:5]) - if speed < 1: - description = 'Calm' - elif speed < 4: - description = 'Light air' - elif speed < 7: - description = 'Light breeze' - elif speed < 11: - description = 'Gentle breeze' - elif speed < 16: - description = 'Moderate breeze' - elif speed < 22: - description = 'Fresh breeze' - elif speed < 28: - description = 'Strong breeze' - elif speed < 34: - description = 'Near gale' - elif speed < 41: - description = 'Gale' - elif speed < 48: - description = 'Strong gale' - elif speed < 56: - description = 'Storm' - elif speed < 64: - description = 'Violent storm' - else: description = 'Hurricane' - - degrees = wind[0:3] - if degrees == 'VRB': - degrees = u'\u21BB'.encode('utf-8') - elif (degrees <= 22.5) or (degrees > 337.5): - degrees = u'\u2191'.encode('utf-8') - elif (degrees > 22.5) and (degrees <= 67.5): - degrees = u'\u2197'.encode('utf-8') - elif (degrees > 67.5) and (degrees <= 112.5): - degrees = u'\u2192'.encode('utf-8') - elif (degrees > 112.5) and (degrees <= 157.5): - degrees = u'\u2198'.encode('utf-8') - elif (degrees > 157.5) and (degrees <= 202.5): - degrees = u'\u2193'.encode('utf-8') - elif (degrees > 202.5) and (degrees <= 247.5): - degrees = u'\u2199'.encode('utf-8') - elif (degrees > 247.5) and (degrees <= 292.5): - degrees = u'\u2190'.encode('utf-8') - elif (degrees > 292.5) and (degrees <= 337.5): - degrees = u'\u2196'.encode('utf-8') - - if not icao_code.startswith('EN') and not icao_code.startswith('ED'): - wind = '%s %skt (%s)' % (description, speed, degrees) - elif icao_code.startswith('ED'): - kmh = int(round(speed * 1.852, 0)) - wind = '%s %skm/h (%skt) (%s)' % (description, kmh, speed, degrees) - elif icao_code.startswith('EN'): - ms = int(round(speed * 0.514444444, 0)) - wind = '%s %sm/s (%skt) (%s)' % (description, ms, speed, degrees) - else: wind = '(wind unknown)' - - if visibility: - visibility = visibility + 'm' - else: visibility = '(visibility unknown)' - - if cover: - level = None - for c in cover: - if c.startswith('OVC') or c.startswith('VV'): - if (level is None) or (level < 8): - level = 8 - elif c.startswith('BKN'): - if (level is None) or (level < 5): - level = 5 - elif c.startswith('SCT'): - if (level is None) or (level < 3): - level = 3 - elif c.startswith('FEW'): - if (level is None) or (level < 1): - level = 1 - elif c.startswith('SKC') or c.startswith('CLR'): - if level is None: - level = 0 - - if level == 8: - cover = u'Overcast \u2601'.encode('utf-8') - elif level == 5: - cover = 'Cloudy' - elif level == 3: - cover = 'Scattered' - elif (level == 1) or (level == 0): - cover = u'Clear \u263C'.encode('utf-8') - else: cover = 'Cover Unknown' - else: cover = 'Cover Unknown' - - if temp: - if '/' in temp: - temp = temp.split('/')[0] - else: temp = temp.split('.')[0] - if temp.startswith('M'): - temp = '-' + temp[1:] - try: temp = int(temp) - except ValueError: temp = '?' - else: temp = '?' - - if pressure: - if pressure.startswith('Q'): - pressure = pressure.lstrip('Q') - if pressure != 'NIL': - pressure = str(int(pressure)) + 'mb' - else: pressure = '?mb' - elif pressure.startswith('A'): - pressure = pressure.lstrip('A') - if pressure != 'NIL': - inches = pressure[:2] + '.' + pressure[2:] - mb = int(float(inches) * 33.7685) - pressure = '%sin (%smb)' % (inches, mb) - else: pressure = '?mb' - - if isinstance(temp, int): - f = round((temp * 1.8) + 32, 2) - temp = u'%s\u2109 (%s\u2103)'.encode('utf-8') % (f, temp) - else: pressure = '?mb' - if isinstance(temp, int): - temp = u'%s\u2103'.encode('utf-8') % temp - - if cond: - conds = cond - cond = '' - - intensities = { - '-': 'Light', - '+': 'Heavy' - } - - descriptors = { - 'MI': 'Shallow', - 'PR': 'Partial', - 'BC': 'Patches', - 'DR': 'Drifting', - 'BL': 'Blowing', - 'SH': 'Showers of', - 'TS': 'Thundery', - 'FZ': 'Freezing', - 'VC': 'In the vicinity:' - } - - phenomena = { - 'DZ': 'Drizzle', - 'RA': 'Rain', - 'SN': 'Snow', - 'SG': 'Snow Grains', - 'IC': 'Ice Crystals', - 'PL': 'Ice Pellets', - 'GR': 'Hail', - 'GS': 'Small Hail', - 'UP': 'Unknown Precipitation', - 'BR': 'Mist', - 'FG': 'Fog', - 'FU': 'Smoke', - 'VA': 'Volcanic Ash', - 'DU': 'Dust', - 'SA': 'Sand', - 'HZ': 'Haze', - 'PY': 'Spray', - 'PO': 'Whirls', - 'SQ': 'Squalls', - 'FC': 'Tornado', - 'SS': 'Sandstorm', - 'DS': 'Duststorm', - # ? Cf. http://swhack.com/logs/2007-10-05#T07-58-56 - 'TS': 'Thunderstorm', - 'SH': 'Showers' - } - - for c in conds: - if c.endswith('//'): - if cond: cond += ', ' - cond += 'Some Precipitation' - elif len(c) == 5: - intensity = intensities[c[0]] - descriptor = descriptors[c[1:3]] - phenomenon = phenomena.get(c[3:], c[3:]) - if cond: cond += ', ' - cond += intensity + ' ' + descriptor + ' ' + phenomenon - elif len(c) == 4: - descriptor = descriptors.get(c[:2], c[:2]) - phenomenon = phenomena.get(c[2:], c[2:]) - if cond: cond += ', ' - cond += descriptor + ' ' + phenomenon - elif len(c) == 3: - intensity = intensities.get(c[0], c[0]) - phenomenon = phenomena.get(c[1:], c[1:]) - if cond: cond += ', ' - cond += intensity + ' ' + phenomenon - elif len(c) == 2: - phenomenon = phenomena.get(c, c) - if cond: cond += ', ' - cond += phenomenon - - # if not cond: - # format = u'%s at %s: %s, %s, %s, %s' - # args = (icao, time, cover, temp, pressure, wind) - # else: - # format = u'%s at %s: %s, %s, %s, %s, %s' - # args = (icao, time, cover, temp, pressure, cond, wind) - - if not cond: - format = u'%s, %s, %s, %s - %s %s' - args = (cover, temp, pressure, wind, str(icao_code), time) - else: - format = u'%s, %s, %s, %s, %s - %s, %s' - args = (cover, temp, pressure, cond, wind, str(icao_code), time) - - self.msg(origin.sender, format.encode('utf-8') % args) +def f_weather(self, origin, match, args): + """.weather - Show the weather at airport with the code .""" + if origin.sender == '#talis': + if args[0].startswith('.weather '): return + + icao_code = match.group(2) + if not icao_code: + return self.msg(origin.sender, 'Try .weather London, for example?') + + icao_code = code(self, icao_code) + + if not icao_code: + self.msg(origin.sender, 'No ICAO code found, sorry') + return + + uri = 'http://weather.noaa.gov/pub/data/observations/metar/stations/%s.TXT' + try: bytes = web.get(uri % icao_code) + except AttributeError: + raise GrumbleError('OH CRAP NOAA HAS GONE DOWN THE WEB IS BROKEN') + if 'Not Found' in bytes: + self.msg(origin.sender, icao_code+': no such ICAO code, or no NOAA data') + return + + metar = bytes.splitlines().pop() + metar = metar.split(' ') + + if len(metar[0]) == 4: + metar = metar[1:] + + if metar[0].endswith('Z'): + time = metar[0] + metar = metar[1:] + else: time = None + + if metar[0] == 'AUTO': + metar = metar[1:] + if metar[0] == 'VCU': + self.msg(origin.sender, icao_code + ': no data provided') + return + + if metar[0].endswith('KT'): + wind = metar[0] + metar = metar[1:] + else: wind = None + + if ('V' in metar[0]) and (metar[0] != 'CAVOK'): + vari = metar[0] + metar = metar[1:] + else: vari = None + + if ((len(metar[0]) == 4) or + metar[0].endswith('SM')): + visibility = metar[0] + metar = metar[1:] + else: visibility = None + + while metar[0].startswith('R') and (metar[0].endswith('L') + or 'L/' in metar[0]): + metar = metar[1:] + + if len(metar[0]) == 6 and (metar[0].endswith('N') or + metar[0].endswith('E') or + metar[0].endswith('S') or + metar[0].endswith('W')): + metar = metar[1:] # 7000SE? + + cond = [] + while (((len(metar[0]) < 5) or + metar[0].startswith('+') or + metar[0].startswith('-')) and (not (metar[0].startswith('VV') or + metar[0].startswith('SKC') or metar[0].startswith('CLR') or + metar[0].startswith('FEW') or metar[0].startswith('SCT') or + metar[0].startswith('BKN') or metar[0].startswith('OVC')))): + cond.append(metar[0]) + metar = metar[1:] + + while '/P' in metar[0]: + metar = metar[1:] + + if not metar: + self.msg(origin.sender, icao_code + ': no data provided') + return + + cover = [] + while (metar[0].startswith('VV') or metar[0].startswith('SKC') or + metar[0].startswith('CLR') or metar[0].startswith('FEW') or + metar[0].startswith('SCT') or metar[0].startswith('BKN') or + metar[0].startswith('OVC')): + cover.append(metar[0]) + metar = metar[1:] + if not metar: + self.msg(origin.sender, icao_code + ': no data provided') + return + + if metar[0] == 'CAVOK': + cover.append('CLR') + metar = metar[1:] + + if metar[0] == 'PRFG': + cover.append('CLR') # @@? + metar = metar[1:] + + if metar[0] == 'NSC': + cover.append('CLR') + metar = metar[1:] + + if ('/' in metar[0]) or (len(metar[0]) == 5 and metar[0][2] == '.'): + temp = metar[0] + metar = metar[1:] + else: temp = None + + if metar[0].startswith('QFE'): + metar = metar[1:] + + if metar[0].startswith('Q') or metar[0].startswith('A'): + pressure = metar[0] + metar = metar[1:] + else: pressure = None + + if time: + hour = time[2:4] + minute = time[4:6] + time = local(icao_code, hour, minute) + else: time = '(time unknown)' + + if wind: + speed = int(wind[3:5]) + if speed < 1: + description = 'Calm' + elif speed < 4: + description = 'Light air' + elif speed < 7: + description = 'Light breeze' + elif speed < 11: + description = 'Gentle breeze' + elif speed < 16: + description = 'Moderate breeze' + elif speed < 22: + description = 'Fresh breeze' + elif speed < 28: + description = 'Strong breeze' + elif speed < 34: + description = 'Near gale' + elif speed < 41: + description = 'Gale' + elif speed < 48: + description = 'Strong gale' + elif speed < 56: + description = 'Storm' + elif speed < 64: + description = 'Violent storm' + else: description = 'Hurricane' + + degrees = wind[0:3] + if degrees == 'VRB': + degrees = u'\u21BB'.encode('utf-8') + elif (degrees <= 22.5) or (degrees > 337.5): + degrees = u'\u2191'.encode('utf-8') + elif (degrees > 22.5) and (degrees <= 67.5): + degrees = u'\u2197'.encode('utf-8') + elif (degrees > 67.5) and (degrees <= 112.5): + degrees = u'\u2192'.encode('utf-8') + elif (degrees > 112.5) and (degrees <= 157.5): + degrees = u'\u2198'.encode('utf-8') + elif (degrees > 157.5) and (degrees <= 202.5): + degrees = u'\u2193'.encode('utf-8') + elif (degrees > 202.5) and (degrees <= 247.5): + degrees = u'\u2199'.encode('utf-8') + elif (degrees > 247.5) and (degrees <= 292.5): + degrees = u'\u2190'.encode('utf-8') + elif (degrees > 292.5) and (degrees <= 337.5): + degrees = u'\u2196'.encode('utf-8') + + if not icao_code.startswith('EN') and not icao_code.startswith('ED'): + wind = '%s %skt (%s)' % (description, speed, degrees) + elif icao_code.startswith('ED'): + kmh = int(round(speed * 1.852, 0)) + wind = '%s %skm/h (%skt) (%s)' % (description, kmh, speed, degrees) + elif icao_code.startswith('EN'): + ms = int(round(speed * 0.514444444, 0)) + wind = '%s %sm/s (%skt) (%s)' % (description, ms, speed, degrees) + else: wind = '(wind unknown)' + + if visibility: + visibility = visibility + 'm' + else: visibility = '(visibility unknown)' + + if cover: + level = None + for c in cover: + if c.startswith('OVC') or c.startswith('VV'): + if (level is None) or (level < 8): + level = 8 + elif c.startswith('BKN'): + if (level is None) or (level < 5): + level = 5 + elif c.startswith('SCT'): + if (level is None) or (level < 3): + level = 3 + elif c.startswith('FEW'): + if (level is None) or (level < 1): + level = 1 + elif c.startswith('SKC') or c.startswith('CLR'): + if level is None: + level = 0 + + if level == 8: + cover = u'Overcast \u2601'.encode('utf-8') + elif level == 5: + cover = 'Cloudy' + elif level == 3: + cover = 'Scattered' + elif (level == 1) or (level == 0): + cover = u'Clear \u263C'.encode('utf-8') + else: cover = 'Cover Unknown' + else: cover = 'Cover Unknown' + + if temp: + if '/' in temp: + temp = temp.split('/')[0] + else: temp = temp.split('.')[0] + if temp.startswith('M'): + temp = '-' + temp[1:] + try: temp = int(temp) + except ValueError: temp = '?' + else: temp = '?' + + if pressure: + if pressure.startswith('Q'): + pressure = pressure.lstrip('Q') + if pressure != 'NIL': + pressure = str(int(pressure)) + 'mb' + else: pressure = '?mb' + elif pressure.startswith('A'): + pressure = pressure.lstrip('A') + if pressure != 'NIL': + inches = pressure[:2] + '.' + pressure[2:] + mb = int(float(inches) * 33.7685) + pressure = '%sin (%smb)' % (inches, mb) + else: pressure = '?mb' + + if isinstance(temp, int): + f = round((temp * 1.8) + 32, 2) + temp = u'%s\u2109 (%s\u2103)'.encode('utf-8') % (f, temp) + else: pressure = '?mb' + if isinstance(temp, int): + temp = u'%s\u2103'.encode('utf-8') % temp + + if cond: + conds = cond + cond = '' + + intensities = { + '-': 'Light', + '+': 'Heavy' + } + + descriptors = { + 'MI': 'Shallow', + 'PR': 'Partial', + 'BC': 'Patches', + 'DR': 'Drifting', + 'BL': 'Blowing', + 'SH': 'Showers of', + 'TS': 'Thundery', + 'FZ': 'Freezing', + 'VC': 'In the vicinity:' + } + + phenomena = { + 'DZ': 'Drizzle', + 'RA': 'Rain', + 'SN': 'Snow', + 'SG': 'Snow Grains', + 'IC': 'Ice Crystals', + 'PL': 'Ice Pellets', + 'GR': 'Hail', + 'GS': 'Small Hail', + 'UP': 'Unknown Precipitation', + 'BR': 'Mist', + 'FG': 'Fog', + 'FU': 'Smoke', + 'VA': 'Volcanic Ash', + 'DU': 'Dust', + 'SA': 'Sand', + 'HZ': 'Haze', + 'PY': 'Spray', + 'PO': 'Whirls', + 'SQ': 'Squalls', + 'FC': 'Tornado', + 'SS': 'Sandstorm', + 'DS': 'Duststorm', + # ? Cf. http://swhack.com/logs/2007-10-05#T07-58-56 + 'TS': 'Thunderstorm', + 'SH': 'Showers' + } + + for c in conds: + if c.endswith('//'): + if cond: cond += ', ' + cond += 'Some Precipitation' + elif len(c) == 5: + intensity = intensities[c[0]] + descriptor = descriptors[c[1:3]] + phenomenon = phenomena.get(c[3:], c[3:]) + if cond: cond += ', ' + cond += intensity + ' ' + descriptor + ' ' + phenomenon + elif len(c) == 4: + descriptor = descriptors.get(c[:2], c[:2]) + phenomenon = phenomena.get(c[2:], c[2:]) + if cond: cond += ', ' + cond += descriptor + ' ' + phenomenon + elif len(c) == 3: + intensity = intensities.get(c[0], c[0]) + phenomenon = phenomena.get(c[1:], c[1:]) + if cond: cond += ', ' + cond += intensity + ' ' + phenomenon + elif len(c) == 2: + phenomenon = phenomena.get(c, c) + if cond: cond += ', ' + cond += phenomenon + + # if not cond: + # format = u'%s at %s: %s, %s, %s, %s' + # args = (icao, time, cover, temp, pressure, wind) + # else: + # format = u'%s at %s: %s, %s, %s, %s, %s' + # args = (icao, time, cover, temp, pressure, cond, wind) + + if not cond: + format = u'%s, %s, %s, %s - %s %s' + args = (cover, temp, pressure, wind, str(icao_code), time) + else: + format = u'%s, %s, %s, %s, %s - %s, %s' + args = (cover, temp, pressure, cond, wind, str(icao_code), time) + + self.msg(origin.sender, format.encode('utf-8') % args) f_weather.rule = (['weather'], r'(.*)') -if __name__ == '__main__': - print __doc__.strip() +if __name__ == '__main__': + print __doc__.strip() diff --git a/modules/wikipedia.py b/modules/wikipedia.py index 1a406b3..489afe9 100755 --- a/modules/wikipedia.py +++ b/modules/wikipedia.py @@ -12,171 +12,171 @@ import web wikiuri = 'http://%s.wikipedia.org/wiki/%s' # wikisearch = 'http://%s.wikipedia.org/wiki/Special:Search?' \ -# + 'search=%s&fulltext=Search' +# + 'search=%s&fulltext=Search' r_tr = re.compile(r'(?ims)]*>.*?') r_paragraph = re.compile(r'(?ims)]*>.*?

    |]*>.*?') r_tag = re.compile(r'<(?!!)[^>]+>') r_whitespace = re.compile(r'[\t\r\n ]+') r_redirect = re.compile( - r'(?ims)class=.redirectText.>\s*\s*') - s = s.replace('<', '<') - s = s.replace('&', '&') - s = s.replace(' ', ' ') - return s - -def text(html): - html = r_tag.sub('', html) - html = r_whitespace.sub(' ', html) - return unescape(html).strip() - -def search(term): - try: import search - except ImportError, e: - print e - return term - - if isinstance(term, unicode): - term = term.encode('utf-8') - else: term = term.decode('utf-8') - - term = term.replace('_', ' ') - try: uri = search.google_search('site:en.wikipedia.org %s' % term) - except IndexError: return term - if uri: - return uri[len('http://en.wikipedia.org/wiki/'):] - else: return term - -def wikipedia(term, language='en', last=False): - global wikiuri - if not '%' in term: - if isinstance(term, unicode): - t = term.encode('utf-8') - else: t = term - q = urllib.quote(t) - u = wikiuri % (language, q) - bytes = web.get(u) - else: bytes = web.get(wikiuri % (language, term)) - - if bytes.startswith('\x1f\x8b\x08\x00\x00\x00\x00\x00'): - f = StringIO.StringIO(bytes) - f.seek(0) - gzip_file = gzip.GzipFile(fileobj=f) - bytes = gzip_file.read() - gzip_file.close() - f.close() - - bytes = r_tr.sub('', bytes) - - if not last: - r = r_redirect.search(bytes[:4096]) - if r: - term = urllib.unquote(r.group(1)) - return wikipedia(term, language=language, last=True) - - paragraphs = r_paragraph.findall(bytes) - - if not paragraphs: - if not last: - term = search(term) - return wikipedia(term, language=language, last=True) - return None - - # Pre-process - paragraphs = [para for para in paragraphs - if (para and 'technical limitations' not in para - and 'window.showTocToggle' not in para - and 'Deletion_policy' not in para - and 'Template:AfD_footer' not in para - and not (para.startswith('

    ') and - para.endswith('

    ')) - and not 'disambiguation)"' in para) - and not '(images and media)' in para - and not 'This article contains a' in para - and not 'id="coordinates"' in para - and not 'class="thumb' in para] - # and not 'style="display:none"' in para] - - for i, para in enumerate(paragraphs): - para = para.replace('', '|') - para = para.replace('', '|') - paragraphs[i] = text(para).strip() - - # Post-process - paragraphs = [para for para in paragraphs if - (para and not (para.endswith(':') and len(para) < 150))] - - para = text(paragraphs[0]) - m = r_sentence.match(para) - - if not m: - if not last: - term = search(term) - return wikipedia(term, language=language, last=True) - return None - sentence = m.group(0) - - maxlength = 275 - if len(sentence) > maxlength: - sentence = sentence[:maxlength] - words = sentence[:-5].split(' ') - words.pop() - sentence = ' '.join(words) + ' [...]' - - if (('using the Article Wizard if you wish' in sentence) - or ('or add a request for it' in sentence) - or ('in existing articles' in sentence)): - if not last: - term = search(term) - return wikipedia(term, language=language, last=True) - return None - - sentence = '"' + sentence.replace('"', "'") + '"' - sentence = sentence.decode('utf-8').encode('utf-8') - wikiuri = wikiuri.decode('utf-8').encode('utf-8') - term = term.decode('utf-8').encode('utf-8') - return sentence + ' - ' + (wikiuri % (language, term)) - -def wik(phenny, input): - origterm = input.groups()[1] - if not origterm: - return phenny.say('Perhaps you meant ".wik Zen"?') - origterm = origterm.encode('utf-8') - - term = urllib.unquote(origterm) - language = 'en' - if term.startswith(':') and (' ' in term): - a, b = term.split(' ', 1) - a = a.lstrip(':') - if a.isalpha(): - language, term = a, b - term = term[0].upper() + term[1:] - term = term.replace(' ', '_') - - try: result = wikipedia(term, language) - except IOError: - args = (language, wikiuri % (language, term)) - error = "Can't connect to %s.wikipedia.org (%s)" % args - return phenny.say(error) - - if result is not None: - phenny.say(result) - else: phenny.say('Can\'t find anything in Wikipedia for "%s".' % origterm) +def unescape(s): + s = s.replace('>', '>') + s = s.replace('<', '<') + s = s.replace('&', '&') + s = s.replace(' ', ' ') + return s + +def text(html): + html = r_tag.sub('', html) + html = r_whitespace.sub(' ', html) + return unescape(html).strip() + +def search(term): + try: import search + except ImportError, e: + print e + return term + + if isinstance(term, unicode): + term = term.encode('utf-8') + else: term = term.decode('utf-8') + + term = term.replace('_', ' ') + try: uri = search.google_search('site:en.wikipedia.org %s' % term) + except IndexError: return term + if uri: + return uri[len('http://en.wikipedia.org/wiki/'):] + else: return term + +def wikipedia(term, language='en', last=False): + global wikiuri + if not '%' in term: + if isinstance(term, unicode): + t = term.encode('utf-8') + else: t = term + q = urllib.quote(t) + u = wikiuri % (language, q) + bytes = web.get(u) + else: bytes = web.get(wikiuri % (language, term)) + + if bytes.startswith('\x1f\x8b\x08\x00\x00\x00\x00\x00'): + f = StringIO.StringIO(bytes) + f.seek(0) + gzip_file = gzip.GzipFile(fileobj=f) + bytes = gzip_file.read() + gzip_file.close() + f.close() + + bytes = r_tr.sub('', bytes) + + if not last: + r = r_redirect.search(bytes[:4096]) + if r: + term = urllib.unquote(r.group(1)) + return wikipedia(term, language=language, last=True) + + paragraphs = r_paragraph.findall(bytes) + + if not paragraphs: + if not last: + term = search(term) + return wikipedia(term, language=language, last=True) + return None + + # Pre-process + paragraphs = [para for para in paragraphs + if (para and 'technical limitations' not in para + and 'window.showTocToggle' not in para + and 'Deletion_policy' not in para + and 'Template:AfD_footer' not in para + and not (para.startswith('

    ') and + para.endswith('

    ')) + and not 'disambiguation)"' in para) + and not '(images and media)' in para + and not 'This article contains a' in para + and not 'id="coordinates"' in para + and not 'class="thumb' in para] + # and not 'style="display:none"' in para] + + for i, para in enumerate(paragraphs): + para = para.replace('', '|') + para = para.replace('', '|') + paragraphs[i] = text(para).strip() + + # Post-process + paragraphs = [para for para in paragraphs if + (para and not (para.endswith(':') and len(para) < 150))] + + para = text(paragraphs[0]) + m = r_sentence.match(para) + + if not m: + if not last: + term = search(term) + return wikipedia(term, language=language, last=True) + return None + sentence = m.group(0) + + maxlength = 275 + if len(sentence) > maxlength: + sentence = sentence[:maxlength] + words = sentence[:-5].split(' ') + words.pop() + sentence = ' '.join(words) + ' [...]' + + if (('using the Article Wizard if you wish' in sentence) + or ('or add a request for it' in sentence) + or ('in existing articles' in sentence)): + if not last: + term = search(term) + return wikipedia(term, language=language, last=True) + return None + + sentence = '"' + sentence.replace('"', "'") + '"' + sentence = sentence.decode('utf-8').encode('utf-8') + wikiuri = wikiuri.decode('utf-8').encode('utf-8') + term = term.decode('utf-8').encode('utf-8') + return sentence + ' - ' + (wikiuri % (language, term)) + +def wik(phenny, input): + origterm = input.groups()[1] + if not origterm: + return phenny.say('Perhaps you meant ".wik Zen"?') + origterm = origterm.encode('utf-8') + + term = urllib.unquote(origterm) + language = 'en' + if term.startswith(':') and (' ' in term): + a, b = term.split(' ', 1) + a = a.lstrip(':') + if a.isalpha(): + language, term = a, b + term = term[0].upper() + term[1:] + term = term.replace(' ', '_') + + try: result = wikipedia(term, language) + except IOError: + args = (language, wikiuri % (language, term)) + error = "Can't connect to %s.wikipedia.org (%s)" % args + return phenny.say(error) + + if result is not None: + phenny.say(result) + else: phenny.say('Can\'t find anything in Wikipedia for "%s".' % origterm) wik.commands = ['wik'] wik.priority = 'high' -if __name__ == '__main__': - print __doc__.strip() +if __name__ == '__main__': + print __doc__.strip() diff --git a/modules/wiktionary.py b/modules/wiktionary.py index 9229194..d3321c5 100755 --- a/modules/wiktionary.py +++ b/modules/wiktionary.py @@ -14,87 +14,87 @@ uri = 'http://en.wiktionary.org/w/index.php?title=%s&printable=yes' r_tag = re.compile(r'<[^>]+>') r_ul = re.compile(r'(?ims)
      .*?
    ') -def text(html): - text = r_tag.sub('', html).strip() - text = text.replace('\n', ' ') - text = text.replace('\r', '') - text = text.replace('(intransitive', '(intr.') - text = text.replace('(transitive', '(trans.') - return text +def text(html): + text = r_tag.sub('', html).strip() + text = text.replace('\n', ' ') + text = text.replace('\r', '') + text = text.replace('(intransitive', '(intr.') + text = text.replace('(transitive', '(trans.') + return text -def wiktionary(word): - bytes = web.get(uri % web.urllib.quote(word.encode('utf-8'))) - bytes = r_ul.sub('', bytes) +def wiktionary(word): + bytes = web.get(uri % web.urllib.quote(word.encode('utf-8'))) + bytes = r_ul.sub('', bytes) - mode = None - etymology = None - definitions = {} - for line in bytes.splitlines(): - if 'id="Etymology"' in line: - mode = 'etymology' - elif 'id="Noun"' in line: - mode = 'noun' - elif 'id="Verb"' in line: - mode = 'verb' - elif 'id="Adjective"' in line: - mode = 'adjective' - elif 'id="Adverb"' in line: - mode = 'adverb' - elif 'id="Interjection"' in line: - mode = 'interjection' - elif 'id="Particle"' in line: - mode = 'particle' - elif 'id="Preposition"' in line: - mode = 'preposition' - elif 'id="' in line: - mode = None + mode = None + etymology = None + definitions = {} + for line in bytes.splitlines(): + if 'id="Etymology"' in line: + mode = 'etymology' + elif 'id="Noun"' in line: + mode = 'noun' + elif 'id="Verb"' in line: + mode = 'verb' + elif 'id="Adjective"' in line: + mode = 'adjective' + elif 'id="Adverb"' in line: + mode = 'adverb' + elif 'id="Interjection"' in line: + mode = 'interjection' + elif 'id="Particle"' in line: + mode = 'particle' + elif 'id="Preposition"' in line: + mode = 'preposition' + elif 'id="' in line: + mode = None - elif (mode == 'etmyology') and ('

    ' in line): - etymology = text(line) - elif (mode is not None) and ('

  • ' in line): - definitions.setdefault(mode, []).append(text(line)) + elif (mode == 'etmyology') and ('

    ' in line): + etymology = text(line) + elif (mode is not None) and ('

  • ' in line): + definitions.setdefault(mode, []).append(text(line)) - if ' 300: - result = result[:295] + '[...]' - phenny.say(result) + if len(result) > 300: + result = result[:295] + '[...]' + phenny.say(result) w.commands = ['w'] w.example = '.w bailiwick' -def encarta(phenny, input): - return phenny.reply('Microsoft removed Encarta, try .w instead!') +def encarta(phenny, input): + return phenny.reply('Microsoft removed Encarta, try .w instead!') encarta.commands = ['dict'] -if __name__ == '__main__': - print __doc__.strip() +if __name__ == '__main__': + print __doc__.strip() diff --git a/opt/freenode.py b/opt/freenode.py index 0c08cf2..9d8a7f3 100755 --- a/opt/freenode.py +++ b/opt/freenode.py @@ -7,32 +7,32 @@ Licensed under the Eiffel Forum License 2. http://inamidst.com/phenny/ """ -def replaced(phenny, input): - command = input.group(1) - responses = { - 'cp': '.cp has been replaced by .u', - 'pc': '.pc has been replaced by .u', - 'unicode': '.unicode has been replaced by .u', - 'compare': '.compare has been replaced by .gcs (googlecounts)', - # 'map': 'the .map command has been removed; ask sbp for details', - 'acronym': 'the .acronym command has been removed; ask sbp for details', - # 'img': 'the .img command has been removed; ask sbp for details', - 'v': '.v has been replaced by .val', - 'validate': '.validate has been replaced by .validate', - # 'rates': "moon wanter. moOOoon wanter!", - 'web': 'the .web command has been removed; ask sbp for details', - 'origin': ".origin hasn't been ported to my new codebase yet" - # 'gs': 'sorry, .gs no longer works' - } - try: response = responses[command] - except KeyError: return - else: phenny.reply(response) +def replaced(phenny, input): + command = input.group(1) + responses = { + 'cp': '.cp has been replaced by .u', + 'pc': '.pc has been replaced by .u', + 'unicode': '.unicode has been replaced by .u', + 'compare': '.compare has been replaced by .gcs (googlecounts)', + # 'map': 'the .map command has been removed; ask sbp for details', + 'acronym': 'the .acronym command has been removed; ask sbp for details', + # 'img': 'the .img command has been removed; ask sbp for details', + 'v': '.v has been replaced by .val', + 'validate': '.validate has been replaced by .validate', + # 'rates': "moon wanter. moOOoon wanter!", + 'web': 'the .web command has been removed; ask sbp for details', + 'origin': ".origin hasn't been ported to my new codebase yet" + # 'gs': 'sorry, .gs no longer works' + } + try: response = responses[command] + except KeyError: return + else: phenny.reply(response) replaced.commands = [ - 'cp', 'pc', 'unicode', 'compare', 'map', 'acronym', - 'v', 'validate', 'thesaurus', 'web', 'mangle', 'origin', - 'swhack' + 'cp', 'pc', 'unicode', 'compare', 'map', 'acronym', + 'v', 'validate', 'thesaurus', 'web', 'mangle', 'origin', + 'swhack' ] replaced.priority = 'low' -if __name__ == '__main__': - print __doc__.strip() +if __name__ == '__main__': + print __doc__.strip() diff --git a/tools.py b/tools.py index 47d582a..75762bd 100755 --- a/tools.py +++ b/tools.py @@ -7,20 +7,20 @@ Licensed under the Eiffel Forum License 2. http://inamidst.com/phenny/ """ -def deprecated(old): - def new(phenny, input, old=old): - self = phenny - origin = type('Origin', (object,), { - 'sender': input.sender, - 'nick': input.nick - })() - match = input.match - args = [input.bytes, input.sender, '@@'] +def deprecated(old): + def new(phenny, input, old=old): + self = phenny + origin = type('Origin', (object,), { + 'sender': input.sender, + 'nick': input.nick + })() + match = input.match + args = [input.bytes, input.sender, '@@'] - old(self, origin, match, args) - new.__module__ = old.__module__ - new.__name__ = old.__name__ - return new + old(self, origin, match, args) + new.__module__ = old.__module__ + new.__name__ = old.__name__ + return new -if __name__ == '__main__': - print __doc__.strip() +if __name__ == '__main__': + print __doc__.strip() diff --git a/web.py b/web.py index 67a4843..b307e26 100755 --- a/web.py +++ b/web.py @@ -8,64 +8,64 @@ About: http://inamidst.com/phenny/ import re, urllib from htmlentitydefs import name2codepoint -class Grab(urllib.URLopener): - def __init__(self, *args): - self.version = 'Mozilla/5.0 (Phenny)' - urllib.URLopener.__init__(self, *args) - def http_error_default(self, url, fp, errcode, errmsg, headers): - return urllib.addinfourl(fp, [headers, errcode], "http:" + url) +class Grab(urllib.URLopener): + def __init__(self, *args): + self.version = 'Mozilla/5.0 (Phenny)' + urllib.URLopener.__init__(self, *args) + def http_error_default(self, url, fp, errcode, errmsg, headers): + return urllib.addinfourl(fp, [headers, errcode], "http:" + url) urllib._urlopener = Grab() -def get(uri): - if not uri.startswith('http'): - return - u = urllib.urlopen(uri) - bytes = u.read() - u.close() - return bytes +def get(uri): + if not uri.startswith('http'): + return + u = urllib.urlopen(uri) + bytes = u.read() + u.close() + return bytes -def head(uri): - if not uri.startswith('http'): - return - u = urllib.urlopen(uri) - info = u.info() - u.close() - return info +def head(uri): + if not uri.startswith('http'): + return + u = urllib.urlopen(uri) + info = u.info() + u.close() + return info -def post(uri, query): - if not uri.startswith('http'): - return - data = urllib.urlencode(query) - u = urllib.urlopen(uri, data) - bytes = u.read() - u.close() - return bytes +def post(uri, query): + if not uri.startswith('http'): + return + data = urllib.urlencode(query) + u = urllib.urlopen(uri, data) + bytes = u.read() + u.close() + return bytes r_entity = re.compile(r'&([^;\s]+);') -def entity(match): - value = match.group(1).lower() - if value.startswith('#x'): - return unichr(int(value[2:], 16)) - elif value.startswith('#'): - return unichr(int(value[1:])) - elif name2codepoint.has_key(value): - return unichr(name2codepoint[value]) - return '[' + value + ']' +def entity(match): + value = match.group(1).lower() + if value.startswith('#x'): + return unichr(int(value[2:], 16)) + elif value.startswith('#'): + return unichr(int(value[1:])) + elif name2codepoint.has_key(value): + return unichr(name2codepoint[value]) + return '[' + value + ']' -def decode(html): - return r_entity.sub(entity, html) +def decode(html): + return r_entity.sub(entity, html) r_string = re.compile(r'("(\\.|[^"\\])*")') r_json = re.compile(r'^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]+$') env = {'__builtins__': None, 'null': None, 'true': True, 'false': False} -def json(text): - """Evaluate JSON text safely (we hope).""" - if r_json.match(r_string.sub('', text)): - text = r_string.sub(lambda m: 'u' + m.group(1), text) - return eval(text.strip(' \t\r\n'), env, {}) - raise ValueError('Input must be serialised JSON.') +def json(text): + """Evaluate JSON text safely (we hope).""" + if r_json.match(r_string.sub('', text)): + text = r_string.sub(lambda m: 'u' + m.group(1), text) + return eval(text.strip(' \t\r\n'), env, {}) + raise ValueError('Input must be serialised JSON.') -if __name__=="__main__": - main() +if __name__=="__main__": + main() -- cgit v1.2.3-1-g7c22